我在试着做这个..。
- 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发布于 2010-10-27 14:28:38
这是你想要的
- f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
= render :partial => 'referral_fields', :locals => {:qf => qf}第一个参数是关联名称,rails需要这个名称才能知道如何构造params。如果您的第一个参数是集合,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>当然,我刚看了你的新评论,也许你不再需要这个了。哦,好吧,更多关于后代的文档:)
https://stackoverflow.com/questions/4034020
复制相似问题