4

我正在使用 Rails 3.2.8,并且每个级别都有一组名称/答案对,用户可以在其中更新:

class UserAnswer < ActiveRecord::Base
  attr_accessible :name, :answer, :level_id, :user_id
end

创建许多视图是如此痛苦:

<li<%if @error_fields.include?('example_name') or @error_fields.include?('example_other_name')%> class="error_section"<%end%>>
  <%= label_tag 'answer[example_name]', 'Example question:' %> <%= text_field_tag 'answer[example_name]', @user_answers['example_name'], placeholder: 'Enter answer', class: @error_fields.include?('example_name') ? 'error_field' : '' %>
  <%= label_tag 'answer[example_other_name]', 'Other example question:' %> <%= text_field_tag 'answer[example_other_name]', @user_answers['example_other_name'], placeholder: 'Enter other answer', class: @error_fields.include?('example_other_name') ? 'error_field' : '' %>
</li>

@user_answers显然是保存用户上次更新答案的哈希值。上面重复的太多了。在 Rails 中处理这个问题的最佳方法是什么?我很想使用类似的东西form_for,但我认为我做不到,因为这不是单个模型对象,而是UserAnswerActiveRecord 实例的集合。

4

2 回答 2

3

在助手中添加:

def field_for(what, errors = {})
  what = what.to_s
  text_field_tag("answer[#{what}]",
    @user_answers[what], placeholder: l(what),
    class: @error_fields.include?(what) ? 'error_field' : '')
end

然后将适当的键添加到您的en.ymlin config/locales。你唯一需要写的是:

<%= label_tag 'answer[example_name]', 'Example question:' %> <%= field_for :example_name, @error_fields %>
于 2012-09-24T08:57:33.857 回答
0

你熟悉 Rails 3.2 ActiveRecord Store吗?

这似乎是一种更简单的存储键/值的方法,并且允许您只说@user_answer.example_name而不是answer[example_name]. 然后你可以在你的表单中有一个 example_name 字段。

class UserAnswer < ActiveRecord::Base
  store :answers, accessors: [:example_name, :example_other_way]
end

answer = UserAnswer.new(example_name: "Example Name")
answer.example_name returns "Example Name"
于 2012-09-27T04:26:17.710 回答