【问题标题】:Passing ID Value to a Controller, Getting Mass Assignment Security Error将 ID 值传递给控制器​​,出现批量分配安全错误
【发布时间】:2012-04-23 01:09:16
【问题描述】:

我有一个消息模型和一个用户模型。我的消息belongs_to 我的用户和用户has_many 消息。

我正在尝试允许用户在其公开个人资料页面(他们的显示模板)上向其他用户发送私人消息。我已经尝试了很多次,但最终我又遇到了要求 ID 为attr_accessible 的问题(我听说这样做不好)。我做错了吗?

我的消息模型,我有:user_id(即当前用户,又名sending_from ID)、:to_id:content

当我查看用户个人资料页面时,在显示模板上我有

    <%= 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 show
   @user = User.find(params[:id])
   @microposts = @user.microposts.paginate(page: params[:page])
   if user_signed_in?
      @message = current_user.messages.build(params[:messages], to_id: @user.id)
   end
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_id attr_accessible 修复它,但是我听说这样做不太安全。难道我做错了什么?这个问题一直在杀死我。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 在我编辑之前,您必须处理一些Alots

标签: ruby-on-rails forms controller attr-accessible


【解决方案1】:

使to_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

批量分配只是意味着你不能使用update_attributes,你仍然可以使用model.attribute=。这样做的原因可能是添加额外的白名单参数,例如:

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

【讨论】:

  • 绝对感谢您再次提供帮助 = ) 并感谢您的解释。这很有帮助。起初我以为我无法以任何方式保存,除非我将其设置为 attr_accessible
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2013-01-12
相关资源
最近更新 更多