首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过fields_for传递选项?

如何通过fields_for传递选项?
EN

Stack Overflow用户
提问于 2010-10-27 13:54:52
回答 1查看 2.3K关注 0票数 1

我在试着做这个..。

代码语言:javascript
复制
- f.fields_for :referrals do |qf|

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

我试过这么做..。

代码语言:javascript
复制
- f.fields_for :referrals do |qf|
  - if qf.object.new_record?
    = render :partial => 'referral_fields', :locals => {:qf => qf}

这使得它在视图中正确显示,但是params仍然使用先前创建的每个嵌套对象填充。

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

我也尝试过这样做:

代码语言:javascript
复制
- f.fields_for @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

此外,还有:

代码语言:javascript
复制
- f.fields_for :referrals, @organization.referrals.select{|ref|ref.new_record?} do |qf|
  = render :partial => 'referral_fields', :locals => {:qf => qf}

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

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

应用程序信息

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

发布于 2010-10-27 14:28:38

这是你想要的

代码语言:javascript
复制
- 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,并且不希望错误地破坏解决方案:)

我的模特:

代码语言:javascript
复制
# 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

我的控制器的编辑动作:

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

我的看法是:

代码语言:javascript
复制
# 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>

当然,我刚看了你的新评论,也许你不再需要这个了。哦,好吧,更多关于后代的文档:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4034020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档