2016-01-22 71 views
3

我正在尝试使用fields_for并创建一个嵌套表单,但只有一个文本字段显示为空白。我有3 crewmember记录。Rails fields_for not working

crewmember模型:

class Crewmember < ActiveRecord::Base 
belongs_to :production 
belongs_to :callsheet 

validates :firstname, presence: true 
validates :email, presence: true 

def name 
    "#{firstname} #{lastname}" 
end 

end 

callsheet模型

class Callsheet < ActiveRecord::Base 
attr_accessible :crewmembers_params 
has_many :castmembers 
has_many :crewmembers 

accepts_nested_attributes_for :crewmembers 
end 

callsheets控制器

class CallsheetsController < ApplicationController 
    def index 
     @callsheets = Callsheet.all 
     @departments = Department.where(production_id: current_user.default_working_production_id) 
    end 

    def show 
     @callsheet = Callsheet.find(params[:id]) 
    end 

    def new 
     @callsheet = Callsheet.new 
     @departments = Department.where(production_id: current_user.default_working_production_id) 
    end 

    def edit 
     @callsheet = Callsheet.find(params[:id]) 
    end 

    def create 
     @callsheet = Callsheet.new(callsheets_params) 
     @Callsheet.production_id = current_user.default_working_production_id 


     if @callsheets.save 
      redirect_to callsheet_path 
     else 
      render 'new' 
     end 
    end 

    def update 
     @callsheet = Callsheet.find(params[:id]) 

     if @callsheet.update(callsheets_params) 
      redirect_to callsheet_path, :notice => "callsheets successfully updated." 
     else 
      render 'edit', :notice => "callsheets not updated." 
     end 
    end 

    def destroy 
     @callsheet = Callsheet.find(params[:id]) 
     @callsheet.destroy 

     redirect_to callsheets_path 
    end 

    private 
     def callsheets_params 
      params.require(:callsheet).permit(:crewmembers_params [:id, :firstname]) 

     end 
end 

形式为新callsheet:

<%= form_for @callsheet do |f| %> 
    <% if @callsheet.errors.any? %> 
    <div id="error_explanation" class="alert alert-danger"> 
     <strong> 
     <%= pluralize(@callsheet.errors.count, "error") %> prohibited 
     this call sheet from being saved: 
     </strong> 
     <ul> 
     <% @callsheet.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <%= f.fields_for :crewmember do |crewmember| %> 
    <fieldset> 
     <%= crewmember.label :firstname, "First Name" %><br /> 
     <%= crewmember.text_field :firstname %> 
    </fieldset> 
    <% end %> 

<% end %> 
+0

该字段为空?你可以插入一个屏幕截图/图像? –

+0

电话簿/新页面上的<%= crewmember.text_field:firstname%>'字段为空,并且只列出一个。最终我想插入每个机组人员的姓名并允许用户从表单中删除机组成员。 –

+0

您是否尝试改变<%= f.fields_for:crewmember do | crewmember | %> <%= f.fields_for:crew members | do | crewmember | %>,请注意那里的复数。 –

回答

0

你不需要attr_accessible(这只适用于Rails 3)。

你也应该所有模型重命名为snake_case,与CamelCase引用:

#app/models/call_sheet.rb 
class CallSheet < ActiveRecord::Base 
    has_many :cast_members 
    has_many :crew_members 
    accepts_nested_attributes_for :crew_members 
end 

如同fields_for自定义,还需要建立相关的对象(如果您要创建一个new记录) (你不需要如果editing做到这一点):

#app/controllers/call_sheets_controller.rb 
class CallSheetsController < ApplicationController 
    before_action :set_departments 

    def new 
     @callsheet = Callsheet.new 
     @callsheet.crew_members.build 
    end 

    def edit 
     @callsheet = Callsheet.find params[:id] 
    end 

    def update 
     @callsheet = Callsheet.find params[:id] 
     @callsheet.update callsheet_params 
    end 

    private 

    def set_departments 
     @departments = Department.where(production_id: current_user.default_working_production_id) 
    end 

    def callsheet_params 
     params.require(:callsheet).permit(crew_members_attributes: [:id, :firstname]) 
    end 
end 

这将允许你使用:

<%= form_for @callsheet do |f| %> 
    <%= f.fields_for :crew_members do |crewmember| %> 
     <%= crewmember.label :firstname, "First Name" %><br /> 
     <%= crewmember.text_field :firstname %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

-

当通过fields_for通过嵌套的属性,你需要几个组件:

  • 在父模型的正确关联
  • 相关模型的实例化版本(@parent.build_child
  • 正确fields_for定义
  • 传递正确parameters通过你的控制器

我已经概述了如何实现上述,所有你不正确。


您还可以在同一呼叫声明多个验证:

#app/models/crew_member.rb 
class CrewMember < ActiveRecord::Base 
    validates :firstname, :email, presence: true 
end