0

我是新來的Ruby和Rails,我試圖把一個嵌套窗體,最終創建一個頁面,但也允許用戶創建個別部分內嵌提交之前這一頁。內聯表單包含兩個按鈕,一個添加一個部分,另一個刪除它。以下是我的相關文件(請讓我知道如果你需要看到任何其他的),我會列出我以後有問題:嵌套窗體不呈現或保存數據

僅供參考,我使用的寶石:SlimSimple Formcocoon和Bootstrap。 On Rails的4

_form.html.slim

= simple_form_for(@page, html: { class: 'form-horizontal' }) do |f| 

    = f.input :title, label: 'Title' 
    = f.input :description, label: 'Desc' 

    .form-group 
    .col-xs-10 
     label Parts 
     .form-inline 
     = f.simple_fields_for :parts do |part| 
      = render 'part_fields', f: part 
     .links 
      = link_to_add_association 'Add Part', f, :parts 

    = f.button :submit 

_parts_fields.html.slim

= f.input :part_type, collection: ['String 1', 'String 2'], prompt: 'Part type', label: false 
= f.input :part_title, placeholder: 'Part title', label: false 
= f.input :part_desc, placeholder: 'Part description', label: false 
= link_to_remove_association 'Remove Part', f 

/models/page.rb

class Page < ActiveRecord::Base 
    belongs_to :project 
    has_many :parts 
    accepts_nested_attributes_for :parts 
end 

/模型/一部分。 rb

class Part < ActiveRecord::Base 
    belongs_to :page 
end 

/controllers/pages_controller.rb

class PagesController < ApplicationController 
    def index 
     @pages = Page.all 

     respond_to do |format| 
      format.html 
      format.json { render json: @pages } 
     end 
    end 

    def new 
     @page = Page.new 

     respond_to do |format| 
      format.html 
      format.json { render json: @page } 
     end 
    end 

    def edit 
     @page = Page.find(params['id']) 
    end 

    def create 
    @page = Page.new(page_params) 

     respond_to do |format| 
      if @page.save 
       format.html { redirect_to(@page) } 
       format.json { render json: @page, status: :created, location: @page } 
      else 
       format.html { render action: 'new' } 
       format.json { render json: @page.errors, status: :unprocessable_entity } 
      end 
     end 
    end 

    def update 
    @page = Page.find(params['id']) 

     respond_to do |format| 
      if @page.update_attributes(page_params) 
       format.html { redirect_to(action: 'index') } 
       format.json { head :ok } 
      else 
       format.html { render action: 'edit' } 
       format.json { render json: @page.errors, status: :unprocessable_entity } 
      end 
     end 
    end 

    def page_params 
     params.require(:page).permit(:title, :description, parts_attributes: [:id, :part_type, :part_title, :part_desc]) 
    end 
end # End Pages Controller 

路線

resources :projects do 
    resources :pages 
end 

resources :pages 

resources :parts 

問題:

1)的形式沒有保存任何數據(不能編輯/更新當前頁面或創建新的)。 更新:已修復,請參閱下面我自己的回答。

2)在部分我使用collection有一個下拉菜單,但這些測試值現在是硬編碼。我怎樣纔能有一個下拉列表填充每個字段與數據庫的列?

3)來自部分的內聯表單元素不會被呈現回主表單上。我所看到的只是「零件」標籤,並且它下面沒有任何元素。 更新@pages.parts.build解決了這個問題。

欣賞你們可以給我的任何幫助。

+1

在您的控制器中,嘗試使用'@ page.parts.build'將新零件實例添加到零件集合中。 –

回答

0

表單現在正在按預期保存數據。在我的一個部分中,我有兩個相同的領域,從而爲我創造了一個無聲的衝突。另外,在我解決這個問題之後,我開始得到一個Unpermitted parameter: _destroy錯誤,並且修復方法是將:_destroy添加到parts_attributes所需的參數列表中。

1
  1. 你有沒有parts一個@page對象。所以當它試圖渲染fields_for時,它確實!只是,零次。在您的控制器中添加@page.parts.build以添加一個。

  2. 不確定;現在太累了。嘗試更改savesave!update_attributesupdate!,以便Rails引發錯誤而不是以失敗方式失敗。順便說一句,爲什麼你的page_params裏面有if params[:page]?這是不需要的;這就是require(:page)所做的。

  3. ActiveRecord提供了一個column_names方法,它返回一個列名稱數組。

+0

感謝您對Ryan發表評論,並對遲到的反應表示歉意。我必須閱讀'build'方法來完全理解它背後的細節,但這確實解決了我的問題的一部分,所以謝謝。表單仍然沒有保存 - 我現在使用'save!'和'update!',但沒有記錄錯誤;事實上,當更新記錄時,我在終端上看到相同的確切輸出。任何想法可以做到這一點? – Blueshift

1

其實,@page.parts.build總是會建立一個新的part,即使用戶沒有要求這一點(它可能是你想要的)。現在,您只顯示每個嵌套部分的Add按鈕。我會假設你想只有一個Add按鈕,如下:

.form-inline 
    = f.simple_fields_for :parts do |part| 
     = render 'parts_fields', f: part 
     = link_to_add_association 'Remove Part', f, :parts    
    = link_to_add_association 'Add Part', f, :parts 

這將始終顯示Add Part鏈接(而且只有一次)。

至於不節能,可能的原因是:

  • 數據不會發送到服務器(檢查你的日誌文件,可能的原因是在你的HTML,如錯誤多個相同IDS)
  • 數據通過您的強參數命令
  • 的數據由reject_if條件的accepts_nested_attributes_for
  • 失敗的驗證閉鎖閉鎖

現在,如果顯示的代碼是您的實際代碼,一切似乎都可以。那麼你可以向我們展示發佈到服務器的內容嗎? (檢查你的日誌文件)。

+0

彌敦道感謝您抽空接觸!我實際上只是想出了爲什麼表格沒有保存(我會發表一篇文章)。我更新了OP中的表格+部分;這個想法是讓用戶在整個表單中只有一個添加部分,並且每個部分旁邊都有一個刪除部分。這是一張圖片。問題:如你所說,一個零件總是默認生成,我怎麼改變這個,所以用戶必須添加第一個零件? – Blueshift