【问题标题】:Hash added to model cannot be used as the field for the Select form tag helper添加到模型的哈希不能用作选择表单标签助手的字段
【发布时间】:2011-09-08 13:08:11
【问题描述】:

我已向模型(从多对多关联填充)添加了一个哈希,并希望在视图中创建可用于更改关联的选择。我遇到的唯一问题是视图本身,我想在其中使用如下构造:

<% categories.each do |category| %>
  <%= select :location, "group_hash[category.id]", category.enumerate_paths) %>
<% end %>

ROR 在“group_hash[category.id]”上阻塞并显示错误消息:

undefined method `group_hash[category.id]' for #<Location:0x107fa2aa0>

即使它已定义。当我使用以下代码手动构建构造时:

<%= tag "select", {:id => "location_group_hash_#{category.id}",
                 :name => "location[group_hash[#{category.id}]]" }%>
<%= options_for_select category.enumerate_paths, 
                     @location.group_hash[category.id] %>

完美运行。我在尝试使用选择表单标签助手时做错了什么,还是这只是助手的限制?

【问题讨论】:

  • 你试过 吗?
  • @Gerry 抱歉,我的原始帖子中有错字。这就是我尝试过的。底线是它不喜欢方法名称中的 [value]。

标签: ruby-on-rails forms select hash


【解决方案1】:

很遗憾,您将无法使用#select 表单助手来访问模型中定义的哈希值。 #select 表单帮助器最终(如果您跟进它)调用 #options_from_collection_for_select 帮助器。代码如下。

如您所见,您作为“方法”(第二个参数)传递给#select 表单助手的内容,在第二次调用中变为 value_method,并最终通过 #send 方法调用在接收对象上调用。所以,发生的事情是 ruby​​ 尝试这样做:

@location.send("group_hash[category.id]")

...因此未定义的方法错误。我不知道有什么方法可以传入额外的参数,当你使用 #select 帮助器时,你需要从哈希中提取适当的值,尽管 #send 方法确实允许发送额外的参数。

您可以想象通过一些骇人听闻的 method_missing 覆盖来完成您所追求的目标,但正如您所说,使用 options_for_select 的另一种情况有效。我建议您使用 #select_tag 而不是单独的 #tag 和 #options_for_select 调用,它期望在其第二个参数中来自 #options_for_select 的输出

  # File actionpack/lib/action_view/helpers/form_options_helper.rb, line 339
def options_from_collection_for_select(collection, value_method, text_method, selected = nil)
  options = collection.map do |element|
    [element.send(text_method), element.send(value_method)]
  end
  selected, disabled = extract_selected_and_disabled(selected)
  select_deselect = {}
  select_deselect[:selected] = extract_values_from_collection(collection, value_method, selected)
  select_deselect[:disabled] = extract_values_from_collection(collection, value_method, disabled)

  options_for_select(options, select_deselect)
end

【讨论】:

  • 感谢您的回复。我有一种感觉,我正在以错误的方式解决这个问题,这就是为什么我不得不围绕实施而努力。我后来的问题涉及整个主题,但到目前为止没有任何回应。
  • 是的,这完全正确。选择助手限制您无法在发送调用中传递所需的其他参数。即使我不知道你为什么要写这个,你必须去实现你自己的选择帮助器来做你想做的事情(即让你可以选择将额外的参数传递给发送调用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多