你如何通过fields_for传递选项?
问题描述:
我试图运行这个..你如何通过fields_for传递选项?
- 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}
这使得它在视图中显示正确,但PARAMS仍填充每一个先前创建的嵌套对象。
这使我相信我需要在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
答
这里有你想要的东西:
- f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
= render :partial => 'referral_fields', :locals => {:qf => qf}
第一个参数是该协会的名称,轨道需要知道如何构造参数。如果您的第一个参数是一个集合,那么rails通常可以从该集合中推断出关联名称。
但是,您的收藏集已被过滤为常规数组,其中关联不易推断。所以你把特定的集合作为第二个参数。
祝你好运!
UPDATE
我已经建立了一个小的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>
当然,我刚刚看了你新的评论,也许你并不需要这个了。哦,更多的文档为后人:)
不行不行。这显示并将所有嵌套对象传递给params。 – Trip 2010-10-27 14:30:41
但是,非常感谢你;) – Trip 2010-10-27 14:45:16
你使用的是什么版本的rails? – 2010-10-27 14:50:10