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`

を作成することで修正できるようですが、そうする: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 に答える