【问题标题】:Rails fields_for not workingRails fields_for 不工作
【发布时间】:2016-01-22 06:27:19
【问题描述】:

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

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

新调用表的表单:

<%= 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 %>

【问题讨论】:

  • 哪个字段是空白的?你能插入屏幕截图/图像吗?
  • 调用表/新页面上的&lt;%= crewmember.text_field :firstname %&gt; 字段为空白,仅列出一个。最终我想插入每个机组成员的姓名,并允许用户从表单中删除机组成员。
  • 您是否尝试过从 到 ,请注意这里的复数形式。
  • 当我这样做时,什么都没有出现
  • 是否有 3 个“@callsheet”记录?我的意思是“@callsheet”记录的总数......

标签: ruby-on-rails forms field


【解决方案1】:

您不需要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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多