Ruby on rails 将ID值传递给控制器,获取批量分配安全错误
我有一个消息模型和一个用户模型。我的信息Ruby on rails 将ID值传递给控制器,获取批量分配安全错误,ruby-on-rails,forms,controller,attr-accessible,Ruby On Rails,Forms,Controller,Attr Accessible,我有一个消息模型和一个用户模型。我的信息属于我的用户,用户有许多信息 我试图允许一个用户在其公共配置文件页面(其显示模板)上向另一个用户发送私人消息。我尝试了很多尝试,但最终还是遇到了一个问题,那就是要求一个ID可以访问attr\u(我听说这样做不好)。我做错什么了吗 在我的消息模型中,我有:user\u id(它是当前用户,也称为a从id>发送消息),:to\u id,:content 当我查看用户配置文件页面时,在show模板上 <%= form_for([current_us
属于
我的用户,用户有许多
信息
我试图允许一个用户在其公共配置文件页面(其显示模板)上向另一个用户发送私人消息。我尝试了很多尝试,但最终还是遇到了一个问题,那就是要求一个ID可以访问attr\u
(我听说这样做不好)。我做错什么了吗
在我的消息模型中,我有:user\u id
(它是当前用户,也称为a从id>发送消息),:to\u id
,:content
当我查看用户配置文件页面时,在show模板上
<%= form_for([current_user, @message]) do |f| %>
<%= f.hidden_field :to_id, :value => @user.id %>
<div class="field">
<%= f.text_area :content, placeholder: "Send a private message..." %>
</div>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>
当表单提交时,它将转到我的消息创建操作
def create
@message = current_user.messages.build(params[:message])
redirect_to user_path(params[:message][:to_id])
end
然而,我总是得到错误
`Can't mass-assign protected attributes: to_id`
似乎我可以通过设置:to\u id attr\u accessible
来修复它,但是我听说这样做并不安全。我做错什么了吗?这个问题一直在折磨着我
任何帮助都将不胜感激。谢谢让访问_id
很好。但如果您不希望出现此错误,请按如下方式进行修复:
def create
@message = current_user.messages.build
@message.to_id = params[:message][:to_id]
# manually assign whatever other params you need to
redirect_to user_path(params[:message][:to_id])
end
批量分配只是意味着您不能使用更新\u属性
,您仍然可以使用模型。属性=
。这样做的原因可能是添加额外的白名单参数,例如:
def create
safe_params = params[:model].slice(:safe_attr1,:safe_attr2)
@model = Model.new(safe_params)
whitelist = ['some_safe_string','another_safe_string']
if whitelist.include?(params[:model][:dangerous])
@model.dangerous_attribute = params[:model][:dangerous]
end
@model.save
redirect_to @model
end
在我编辑这个之前,你必须处理一些!非常感谢你的再次帮助(谢谢你的解释)。这很有帮助。一开始我想,除非我让它成为可访问的属性,否则我无法以任何方式保存
def create
safe_params = params[:model].slice(:safe_attr1,:safe_attr2)
@model = Model.new(safe_params)
whitelist = ['some_safe_string','another_safe_string']
if whitelist.include?(params[:model][:dangerous])
@model.dangerous_attribute = params[:model][:dangerous]
end
@model.save
redirect_to @model
end