在Rails中,如何从collection_select帮助器方法中获取所选值?

时间:2011-08-11 15:21:43

标签: ruby-on-rails ruby-on-rails-3

假设我有我的控制器:

@parts = Part.all

并在视图表单上:

<%= f.collection_select(:part_id, @parts, :id, :title, { :prompt => true } %>

它适用于新的/创建动作,编辑动作也可以,但我想知道如何获取所选值以便在另一个模型上进行查找,因为它是一个嵌套的形式。

或者唯一的方法是使用一些javascript来获取它?

这样做的:

<%= debug f.object.part %>

我明白了:

--- !ruby/object:Part
attributes:
id: 1
title: Pearl 02
part_type_id: 36
created_at: 2011-07-28 07:52:09.000000000Z
updated_at: 2011-07-28 08:34:02.000000000Z
set: !!null 
price: 3.53
 changed_attributes: {}
 previously_changed: {}
 attributes_cache: {}
 marked_for_destruction: false
 destroyed: false
 readonly: false
 new_record: false

我现在唯一想要的属性是“价格”。

尝试访问值:

<%= f.object.part.price %>

然后它会返回错误:

undefined method `price' for nil:NilClass

跟踪向我展示了与我也有的辅助方法相关的东西。

app/views/items/_item_part_fields.html.erb:7:in `_app_views_items__item_part_fields_html_erb___1683960156823546996_2175548540_683257483947746572'
app/helpers/application_helper.rb:46:in `block in link_to_add_fields'
app/helpers/application_helper.rb:45:in `link_to_add_fields'

导致此错误的辅助方法:

def link_to_add_fields(name, f, association)
  new_object = f.object.class.reflect_on_association(association).klass.new
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
    render(association.to_s.singularize + "_fields", :f => builder)
end
  link_to_function(name, "add_fields(this, '#{association}', '#{escape_javascript(fields)}')" )
end  

删除此辅助方法的链接并调用f.object.part.price。

你的想法是什么?

1 个答案:

答案 0 :(得分:1)

<% f.object.part_id = XXX %>
<%= f.collection_select(:part_id, @parts, :id, :title, { :prompt => true } %>

或者更好地在控制器中设置这个东西(因为它是嵌套的形式,我不能用控制器编写解决方案)