13

モデルからすべての値を取得した後、別のカスタム属性を ActiveRecord クラス (この属性は db の列ではありません) に追加してビューで使用できるようにしたいのですが、Rails では追加できません。そのモデル クラスに何を追加すればよいですか?

@test.all

@test.each do |elm|
    elm[:newatt] = 'added string'
end

エラー:

can't write unknown attribute `newatt'
4

8 に答える 8

14

これを試して

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

最後に、あなたが何をしようとしているのか正確にはわかりません。これが意味をなさない場合は、問題をよりよく理解できるように、質問を言い換えてください。

于 2013-08-25T13:32:11.883 に答える
5

これをビューのみに使用し、他の目的がない場合は、attr_accessor を追加する必要はありません

@test.all.select('tests.*, "added string" as newattr')

ここでは、値「追加文字列」を持つ ActiveRecord のクエリ出力の newattr 属性を追加しています。

于 2015-11-18T07:33:18.403 に答える
4

インスタンス変数として仮想属性を定義します。

attr_accessor :newattr
于 2013-08-25T13:08:23.470 に答える
2

一時的な場合は、これを試すことができます:

@test.all.map{ |t| t.attributes.merge({ newatt: "added string" }) }

于 2018-04-02T20:20:34.383 に答える
0

同じ問題に遭遇しました。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を使用しても機能しません

于 2017-01-04T17:45:24.530 に答える
0
@test.all

@test.each do |elm|
    write_attribute(:newatt, "added string")
end
于 2016-07-27T19:16:36.890 に答える