我有一个模型之间具有以下关系的应用程序:
类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”
有没有第三种方法来创建一个新的属于事件的视频,而又不使用嵌套的资源或不影响批量任务的风险?
好了,您可以将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])
现在,用户只能访问他拥有的事件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句