モデルからすべての値を取得した後、別のカスタム属性を ActiveRecord クラス (この属性は db の列ではありません) に追加してビューで使用できるようにしたいのですが、Rails では追加できません。そのモデル クラスに何を追加すればよいですか?
@test.all
@test.each do |elm|
elm[:newatt] = 'added string'
end
エラー:
can't write unknown attribute `newatt'
モデルからすべての値を取得した後、別のカスタム属性を ActiveRecord クラス (この属性は db の列ではありません) に追加してビューで使用できるようにしたいのですが、Rails では追加できません。そのモデル クラスに何を追加すればよいですか?
@test.all
@test.each do |elm|
elm[:newatt] = 'added string'
end
エラー:
can't write unknown attribute `newatt'
これを試して
class Test < ActiveRecord::Base
attr_accessor :newattr
end
次のようにアクセスできます
@test = Test.new
@test.newattr = "value"
お気づきかもしれませんが、これはハッシュではなくプロパティです。したがって、構文を使用し.
ます。ただし、ハッシュのように動作させる必要がある場合は、新しい属性を定義せずにこれを行うことができます
@test.all
@test.each do |elm|
new_elm = {}
new_elm[:newatt] = 'added string'
end
最後に、あなたが何をしようとしているのか正確にはわかりません。これが意味をなさない場合は、問題をよりよく理解できるように、質問を言い換えてください。
これをビューのみに使用し、他の目的がない場合は、attr_accessor を追加する必要はありません
@test.all.select('tests.*, "added string" as newattr')
ここでは、値「追加文字列」を持つ ActiveRecord のクエリ出力の newattr 属性を追加しています。
インスタンス変数として仮想属性を定義します。
attr_accessor :newattr
一時的な場合は、これを試すことができます:
@test.all.map{ |t| t.attributes.merge({ newatt: "added string" }) }
同じ問題に遭遇しました。instance_eval を使用して正常にバイパスします
@test.all
@test.each do |elm|
elm.instance_eval { @newatt = 'added string' }
end
通常、attr_accessor を使用する場合は問題になりません。他の DSL が「newattr=」をオーバーライドして問題を引き起こしている場合に表示されます。私の場合、それはマネーレール「monetize :newatt」です。
Rails 4.xで例外を発生させる理由であるため、明示的にwrite_attributeを使用しても機能しません
@test.all
@test.each do |elm|
write_attribute(:newatt, "added string")
end