【问题标题】:Ruby on Rails: Best way to fill out a model Hash or Array field?Ruby on Rails:填写模型哈希或数组字段的最佳方式?
【发布时间】:2011-03-08 11:34:33
【问题描述】:

我有一个将序列化哈希作为字段的模型。我正在尝试创建一个允许用户填写的表单。 有没有办法使用 Rails form_for helper 来简洁地构建哈希?

模型是一篇文章,一篇文章可以有多个作者,这些作者存储在一个序列化的哈希中。

class Article
  serialize :authors, Hash
end

作者哈希存储有关为文章做出贡献的每个作者的信息,并且可以具有许多可选属性。作者以他们应该出现的顺序为关键字。以下是此类哈希的示例:
{1 => {:name => "William Jones", :contribution => "写了这个问题的正文"}, 2 => {:name => "Billy Bob", :contribution => "给威廉买咖啡", :level => "次要"}

我有一个有点适用于此的表单,我使用 form_for Rails 助手,但我不得不使用 text_field_tag 和其他非模型特定助手来生成作者哈希。例如,其中 key_num 是传递给部分的变量:

<%= text_field_tag "article[authors][#{key_num}][name]", 
    article[authors][#{key_num}] ? article[authors][#{key_num}][:name] : nil %>

显然,这非常丑陋且不清楚。有没有更好的方法来做到这一点我错过了?

我正在对文章进行版本控制,除其他原因外,使用序列化哈希而不是将作者概念转变成单独的子模型非常有帮助。

【问题讨论】:

    标签: ruby-on-rails forms hash


    【解决方案1】:

    我正在尝试做类似的事情,我发现了这种作品:

    <%= form_for @search do |f| %>
        <%= f.fields_for :params, @search.params do |p| %>
            <%= p.select "property_id", [[ "All", 0 ]] + PropertyType.all.collect { |pt| [ pt.value, pt.id ] } %>
    
            <%= p.text_field :min_square_footage, :size => 10, :placeholder => "Min" %>
            <%= p.text_field :max_square_footage, :size => 10, :placeholder => "Max" %>
        <% end %>
    <% end %>
    

    除了在呈现表单时不填充表单字段。提交表单后,值就可以通过了,我可以这样做:

    @search = Search.new(params[:search])
    

    所以它的“一半”工作......

    【讨论】:

    • 将 :params 和 search.params 分别重命名为 :authors search.authors。这应该可以解决问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多