1

モデル間に次の関係を持つアプリがあります。

クラス ContentPartner < ユーザー

  has_many :events, dependent: :destroy
  has_many :videos, through: :events, dependent: :destroy

クラスビデオ

  belongs_to :event

クラス イベント

  has_many :videos, dependent: :destroy

ネストされたリソースを使用せずに (これは望ましくありません)、または :event_id と :content_partner_id をビデオ attr_accessible ホワイトリスト?

このような私のコントローラーで:

  def create
    @event = Event.find(params[:video][:event_id])   
    @video = @event.videos.create(params[:video])
    if @video.save
      flash[:success] = "Video uploaded!"
      redirect_to session[:return_to]
    else
      flash[:error] = "#{@video.errors.messages}"
      render new_video_path
    end  
  end

@videos フォームに hidden_​​field がない場合、「ID のないイベントが見つかりませんでした」というエラーが表示されます。

ただし、次の場合:

    <%= f.hidden_field :event_id, value: @event.id %>

私のフォームでは、「保護された属性を一括割り当てできません: event_id」というエラーが表示されます。

ネストされたリソースを使用したり、大量割り当てのリスクを犠牲にしたりせずに、イベントに属している新しいビデオを作成する 3 つ目の方法はありますか?

4

2 に答える 2

0

hidden_​​field を次のように変更できます。

<%= hidden_field_tag :event_id, @event.id %>

これでコントローラーで、次のようにしてその変数にアクセスできます。

Event.find(params[:event_id])

これにより、一括割り当てエラーが回避されます。しかし今では、悪意のあるユーザーがその隠しフィールドを編集して、任意のイベントにビデオを追加できるようになっています。これを修正するには、関連付けを通じてイベントを見つける必要があります。したがって、current_userまたはがある場合current_content_partner、次のようなイベントを見つける必要があります。

current_content_partner.events.find(params[:event_id])

現在、ユーザーは自分が所有するイベントにのみアクセスできます。

于 2013-11-11T17:50:30.093 に答える
0

エラーが発生しています

1) 「ID のないイベントが見つかりませんでした」: params[:video][:event_id]nil が原因である可能性があります

2)「保護された属性を一括割り当てできません:event_id」:あなたがやっているからです

@video = @event.videos.create(params[:video])params[:video]は保護されたevent_id属性 ですparams[:video][:event_id]event_id

@Ashitakaが言ったように、任意の開発者ツールを使用してUIから非表示フィールドの値を編集できるため、保護された属性(ここではevent_id)を設定することは絶対にお勧めできませんhidden_field

URL から直接nested resources取得するために使用する必要があります。event_id

于 2013-11-11T18:26:23.163 に答える