1

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

我试图允许用户在他们的公共个人资料页面(他们的显示模板)上向另一个用户发送私人消息。我已经尝试了很多尝试,但最终我又遇到了需要 ID 的问题attr_accessible(我听说这样做不好)。难道我做错了什么?

我的消息模型,我有:user_id(这是当前用户,又名sending_fromID):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`

似乎我可以通过 make 修复它:to_id attr_accessible,但是我听说这样做不是很安全。难道我做错了什么?这个问题一直在杀死我。

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

4

1 回答 1

2

使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
于 2012-04-23T01:21:04.583 回答