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でこれを処理する最良の方法は何ですか?のようなものを使用したいのですが、これは単一のモデルオブジェクトではなく、 ActiveRecordインスタンスform_forのコレクションであるため、使用できないと思います。UserAnswer

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.ymlます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 に答える