【问题标题】:How do you pass options through a fields_for?你如何通过 fields_for 传递选项?
【发布时间】:2010-10-27 13:54:52
【问题描述】:

我正在尝试运行它..

- f.fields_for :referrals do |qf|

但我也想通过@organization.referrals.select{|ref|ref.new_record?}。这样传递的表单完全是新对象,而不是旧对象。

我已经尝试过这样做..

- f.fields_for :referrals do |qf|
  - if qf.object.new_record?
    = render :partial => 'referral_fields', :locals => {:qf => qf}

这使它在视图中正确显示,但参数仍填充有每个先前创建的嵌套对象。

这让我相信我需要在 fields_for 语句本身中传递此选项。

我也试过这个:

- f.fields_for @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

还有这个:

- f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

第一个示例将显示并且只允许传递一个对象。我的表单允许动态数量的重复嵌套表单。

第二个将显示并传递所有嵌套对象

应用信息

#organization.rb
has_many  :referrals
accepts_nested_attributes_for :referrals, :reject_if => proc { |attributes| attributes.all? { |k, v| v.blank? } }, :allow_destroy => true
#referral.rb
belongs_to :organization
#referrals_controller.rb
def new
  2.times { @organization.referrals.build }
  ....
def create
  @referral = Referral.new(params[:referral])
  if @referral.valid? && @organization.referrals << @referral
    flash[:notice] = "Referrals saved."
    redirect_to new_organization_referrals_path(@organization)
  else
    render :action => :new, :layout => 'manage'
  end
end

【问题讨论】:

    标签: ruby-on-rails forms nested-forms


    【解决方案1】:

    这就是你想要的:

    - f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
      = render :partial => 'referral_fields', :locals => {:qf => qf}
    

    第一个参数是关联名称,rails 需要它来了解如何构造参数。如果您的第一个参数是一个集合,rails 通常可以从该集合中推断出关联名称。

    但是,您的收藏已被过滤到一个常规数组中,其中的关联无法轻易推断。因此,您将特定集合作为第二个参数传递。

    祝你好运!

    更新

    我已经构建了一个小型 rails 应用程序来分析问题,上面的解决方案对我来说效果很好 - 编辑表单不显示现有的推荐,只显示新的推荐。我将发布相关代码,以便我们可以看到您和我可能会有所不同的地方。需要注意的是,这一切都在 erb 中,因为我很少使用 haml 并且不希望拼写错误弄乱解决方案:)

    我的模型:

    # app/models/organization.rb
    class Organization < ActiveRecord::Base
      has_many :referrals
      accepts_nested_attributes_for :referrals
    end
    
    # app/models/referral.rb
    class Referral < ActiveRecord::Base
      belongs_to :organization
    end
    

    我的控制器的编辑操作:

    # app/controllers/organizations_controller.rb
    class OrganizationsController < ApplicationController
      def edit
        @organization = Organization.find(params[:id])
        2.times { @organization.referrals.build }
      end
    end
    

    我的看法:

    # app/views/organizations/edit.html.erb
    <h1>Editing <%= @organization.name %></h1>
    
    <% form_for(@organization) do |f| %>
      <%= f.error_messages %>
    
      <p>
        <%= f.label :name %><br />
        <%= f.text_field :name %>
      </p>
    
      <% f.fields_for :referrals, @organization.referrals.select{|ref| ref.new_record?} do |referral_fields| %>
        <%= render :partial => 'referral', :locals => {:f => referral_fields} %>
      <% end %>
    
      <p>
        <%= f.submit %>
      </p>
    <% end %>
    
    # app/views/organizations/_referral.html.erb
    <p>
      <%= f.label :name, 'Referral Name' %><br />
      <%= f.text_field :name %>
    </p>
    

    当然,我刚刚看了你的新 cmets,也许你不再需要这个了。哦,好吧,为后代提供更多文档:)

    【讨论】:

    • 不行不行。这将显示所有嵌套对象并将其传递给参数。
    • 你用的是什么版本的rails?
    • Rails -v=2.3.5 。我认为它不起作用的原因是因为当 fields_form 被调用时,它在技术上被认为是“未保存”
    • 对不起,我试图根据文档为您提供解决方案,但实际上我会整理一个示例。回来几个:)
    • 你太棒了! :D 我什至试过这个Referral.all.select{|ref|ref.org_name=nil}。即便如此,它们也会全部返回。但!如果我执行Referral.first 或@organization.referral.first,那么它只会显示那个。所以它确实适用于传递选项,只是没有我需要的选项。嘿,非常感谢 Jaime!
    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 2022-11-10
    • 2023-04-04
    • 2021-01-03
    • 2016-05-26
    • 2013-02-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多