2012-04-23 10 views
1

私はメッセージモデルとユーザーモデルを持っています。私のメッセージbelongs_to私のユーザとユーザhas_manyメッセージ。ID値をコントローラに渡し、一括割り当てセキュリティエラー

公開プロフィールページ(自分のショーテンプレート)で、別のユーザーにプライベートメッセージを送信できるようにしようとしています。私はいくつかの試みを試みましたが、私は最終的にIDがattr_accessible(私は悪いと聞いています)であることを要求する問題に戻ります。私は何か間違っているのですか?

私のメッセージモデルは、:user_id(現在のユーザー、別名:sending_from ID)、:to_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 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で修正できるようですが、それほど安全ではないと聞いています。私は何か間違っているのですか?この問題は私を殺している。

ご協力いただければ幸いです。ありがとう

+0

私はこれを編集していた前に、あなたには、いくつかの[Alots](http://hyperboleandahalf.blogspot.comに対処しなければなりません:そのように行う理由は、以下のような追加のホワイトリストのパラメータを追加するかもしれません/2010/04/alot-is-better-than-you-at-everything.html)! –

答えて

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 
+0

助けてくれてありがとう=) そして説明に感謝します。とても役に立ちました。私は最初に私はそれがattr_accessibleにされていない限り、私はどのような方法で保存することができないと思った – Sasha

関連する問題