0

私はRailsにかなり慣れておらず、最初の「本物の」アプリを構築し、関係を適切に機能させる方法を理解するのに苦労しています。

クイズモデルとアイコンモデルがあります。各クイズはアイコンに属し、アイコンには多くのクイズがあります。(アイコンをカテゴリと考えてください)。

「新規/編集」クイズフォームで、正しいアイコンを選択するための選択ボックスが必要です。現時点で私は...

<%= collection_select(:quiz, :icon_id, Icon.all, :id, :title, :prompt => true) %>

そして、私のクイズコントローラーで私が持っているアクションを作成します...

def create
   @icon = Icon.find(params[:quiz][:icon_id])
   @quiz = @icon.quizzes.build(params[:quiz])
   if @quiz.save
     flash[:success] = "New quiz created successfully!"
     redirect_to @quiz
   else
     render 'new'
   end
end

フォームを送信すると、

Can't mass-assign protected attributes: icon_id

icon_idとして理解しているエラーは、モデルでattr_accessibleとして割り当てられていません。

これには実際のセキュリティリスクがないため、アクセス可能にするか、ビルドメソッドに渡す前にクイズハッシュからicon_idを削除することができますが、これらのオプションはどちらも正しい方法ではないようです。

これを行う正しい方法は何ですか?

ありがとう!

4

2 に答える 2

2

置くだけ

attr_accessible :icon_id

クイズモデルで。

Ruby on Rails APIから:attr_accessible:一括割り当てを介して設定できるモデル属性のホワイトリストを指定します。

于 2012-07-17T03:13:55.350 に答える
2

TL; DR:Railsには、一括割り当てと呼ばれる機能があります。これは、そのparams [:quiz]ハッシュを渡すときに実行する機能です。一括割当を使用して更新する属性には、attr_accessibleを指定する必要があります。

簡単な歴史のレッスン:

以前は、すべての属性がデフォルトで一括割り当て可能であったため、コードは問題なく機能していました。

数か月前、githubで非常に公表されたエピソードがあり、誰かがuser [:admin]=trueの効果を持つ投稿本文を作成することでこの機能を悪用することができました。これにより、ユーザーは事実上管理者アクセス権を取得できました。これは、アプリケーションがadmin=trueを設定することを誰もが妨げなかったためです。これを防ぐ方法はありましたが、開発者はそれを見逃しました。

これに対するRailsの対応は、すべての属性をデフォルトで保護することであり、開発者は一括割り当てによって更新できるフィールドを明示的に指定する必要がありました。これは3.2.3リリースにあったと思います。

于 2012-07-17T03:25:26.213 に答える