我有一个应用程序,模型之间有以下关系:
class 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”
是否有第三种方法可以创建属于事件的新视频而不使用嵌套资源或影响质量分配风险?
答案 0 :(得分: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])
现在,用户只能访问他拥有的事件。
答案 1 :(得分:0)
您收到错误
1)“找不到没有ID的事件”:可能是因为params[:video][:event_id]
为零
2)“无法批量分配受保护的属性:event_id”:因为你正在做
@video = @event.videos.create(params[:video])
params[:video]
包含event_id
params[:video][:event_id]
,其中event_id
是受保护的属性
绝对不建议设置受保护的属性(此处event_id
)到hidden_field
,因为任何用户都可以使用@Ashitaka所述的任何开发人员工具从UI编辑该隐藏字段的值< / p>
您应该使用nested resources
直接从网址获取event_id
。