4

アクティブなレコードの関連付けを attr_accessible 属性のリストに含める必要があるかどうかについて、決定的な答えを見つけようとしています。

私は見た

class Foo

  attr_accessible :name
  attr_accessible :bars

  belongs_to :bar
end

も見られた

  attr_accessible :bars_id

Foo.new(name: 'name' bar: barvar) を実行できる適切な方法を知りたい

4

3 に答える 3

4

多くの場合、決定的な答えは「場合によります™」です。

一括割り当てする属性のみをアクセス可能にする必要があります。

したい、またはする必要がある場合は…</p>

Foo.new(name: 'name', bar: barvar)

…その場合は、アクセス可能するだけbarです。

最後にassign_attributesが呼び出されsend("#{attribute_name}=", attribute_value)、属性のアクセシビリティをチェックした後に簡単に実行されます。

いくつかのコーディング スタイルの側面:

多くの場合、paramハッシュを処理するときに一括割り当てが発生します。少なくとも、そこにセキュリティの問題が潜んでいます。そこにBarオブジェクトがあることはめったにありませんが、より頻繁にbar_id.

ただし、モデルインスタンスを操作する場合、ほとんどの人は関連付けメソッドを使用することを好みます (@Andrew Nesbitt が書いたように)。これにはいくつかの利点があることが多いためです (自動保存、対応する関連付けの自動更新、よりクリーンなコードなど)。

したがって、どちらか一方または両方を使用する理由があります。

私の個人的な意見: Rails 4.0 にはパラメーターのサニタイズのためのより良いソリューションがあるため、このトピックに多くの時間を費やすべきではありません。( Rails 3 でも必要な場合は、strong_parametersを参照してください)

于 2013-01-07T16:35:20.800 に答える
1

アソシエーション ビルダーを使用すると、bar_id をアクセス可能にする必要がなくなります。

# singular (has_one)
foo = bar.build_foo(name: 'name')

# plural (has_many)
foo = bar.foos.build(name: 'name')

関連付けをアクセス可能にする必要があるのは、accepts_nested_attributes を使用している場合のみです。

于 2013-01-07T16:10:38.403 に答える
0

あなたの例ではアクセス可能にすることを避けることができますがbars_id(そうすべきではありませんbar_idか?)、問題は、アプリケーションの一部にアクセスする必要があるかどうかです。active_admin を使用して、リレーションを操作できるようにする必要がwhatever_idありました。

于 2013-01-07T16:33:55.497 に答える