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 传递给它,而不使用嵌套资源(我不想要)或通过添加 :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”

是否有第三种方法可以在不使用嵌套资源或不影响大规模分配风险的情况下创建属于某个事件的新视频?

4

2 回答 2

0

好吧,您可以将 hidden_​​field 更改为:

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

现在在您的控制器中,您可以使用以下命令访问该变量:

Event.find(params[:event_id])

这应该避免质量分配错误。但是,现在任何恶意用户都可以编辑该隐藏字段并将视频添加到他希望的任何事件中。要解决此问题,您应该通过关联查找事件。所以如果你有current_useror 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属性

绝对不建议通过设置受保护的属性(此处event_idhidden_field,因为任何用户都可以使用@Ashitaka 所说的任何开发人员工具从 UI 编辑该隐藏字段的值

您应该使用直接从 URLnested resources获取。event_id

于 2013-11-11T18:26:23.163 回答