【问题标题】:How to set up form for a hash in Rails?如何在 Rails 中为哈希设置表单?
【发布时间】:2011-11-23 04:39:41
【问题描述】:

我有一些与散列中的模型相关联的数据。哈希在控制器中生成:@hash

为这些数据创建表单的正确方法是什么?

我为视图想出了以下代码:

  <% @hash.keys.each do |key| %>
    <div class="field">
      <%= f.label key %><br />
      <%= text_field_tag "hash_" + key, @hash[key] %> 
    </div>
  <% end %>

这会生成表单,但会将每个哈希项创建为表单中的单独变量。这似乎不是提交数据的正确方法。我想以哈希的形式取回数据,并使用params[:hash] 访问它。

最好的方法是什么?

在 Rails 3.07、Ruby 1.9.2 中工作。

谢谢。

编辑:我应该说清楚。此代码位于为模型生成的表单内。所以,表单需要提交模型的所有字段,加上上面的哈希。

【问题讨论】:

  • 这个哈希是从哪里来的?如果你能做到,坚持使用 AR 对象,或者按照@lucapette 的建议去做。
  • 我遇到了类似的问题。我的对象来自 Dry-Validation 模型/对象。

标签: ruby-on-rails ruby-on-rails-3 hash parameters form-for


【解决方案1】:

当您使用以 _tag 结尾的助手时,会发生这种情况。

使用f.text_field ... 代替text_field_tag ...

为了获得像params =&gt; {:hash =&gt; {:field1 =&gt; "", :field2 =&gt; ""}} 这样的哈希,您必须将form_forf.input_field_type 配对,而不是简单的input_field_tag

看到区别了吗?

【讨论】:

    【解决方案2】:

    我的回答并不严格,但我真的建议你看看http://railscasts.com/episodes/219-active-model。您可以使用 ActiveModel API 来模拟带有 Rails 3 的模型对象。这样做您可以简单地执行类似

    <%= form_for(@object) %>
    

    并将对象的填充留给 Rails API。

    【讨论】:

    • 同意,但也许这个散列是不良做法的征兆。问他更精确。
    • 有趣。我不确定这种方法是否可行,因为此代码实际上是在为模型生成的表单中。
    • 那你可以尝试使用fields_for...老实说我没有尝试过,但我没有看到任何特别的问题。
    【解决方案3】:

    基于此article,您应该将 text_field_tag 中的名称更改为

    <% @hash.keys.each do |key| %>
      <div class="field">
        <%= f.label key %><br />
        <%= text_field_tag "hash[" + key + "]", @hash[key] %> 
      </div>
    <% end %>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 2021-02-05
    • 2016-01-31
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多