0

シンプルなプライベートメッセージングシステムを作成しようとしています

ネストされたルートがあります

resources :users do
   resources :messages
end

私のユーザーのショーページで、私は持っています...

    <%= form_for([current_user, @message])  do |f| %>
      <div class="field">
        <%= f.text_area :content, placeholder: "Send a private message..." %>
      </div>
      <%= f.submit "Post", class: "btn btn-large btn-primary" %>
    <% end %>

現在のユーザーは、現在見ているユーザーにプライベートメッセージを送信できます。

私のmessage.rbに私は...

belongs_to :user

そしてuser.rbで私は持っています...

has_many :messages

私のユーザーコントローラーで私が持っているアクションを表示します

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])
 end

end

ユーザーがショーテンプレートの送信ボタンを押すと、メッセージ作成アクションに移動しますが、見ている(または送信しようとしている)ユーザーのIDを取得できません

メッセージ変数を印刷すると、次のように表示されます...

[#<Message id: nil, content: nil, user_id: 1, to_id: nil, created_at: nil, updated_at: nil>]

:user_idは現在のユーザー(IDが1の私)ですが、to_id(今見ているユーザーで、IDが2だったとしましょう)を取得できないようです。

誰かがそれを取得する方法を教えてもらえますか?IDを非表示フィールドとして渡すことしか考えられませんが、それは安全ではないと聞きました。

助けていただければ幸いです。ありがとう

更新:@Andrew

うーん、実際には面白いです。

@message = current_user.messages.build(to_id: @user.id)

そして私は渡します

<%= f.hidden_field :to_id, :value => @user.id %>

私は

Can't mass-assign protected attributes: to_id. 

誰かが理由を知っていますか?

4

2 に答える 2

1

UserIDを非表示フィールドに配置しても問題はありません。最初は、URLに表示されます。

ショーアクションにを追加しto_id、フォームのその上に非表示のフィールドがある場合、それはusers#showアクションからメッセージフォームに流れ、次にmessages#createそのフォームが投稿されたときにアクションに流れます。

def show
 @user = User.find(params[:id])
 @microposts = @user.microposts.paginate(page: params[:page])
 if user_signed_in?
    @message = current_user.messages.build(to_id: @user.id)
 end

end

これに投稿しないため、showアクションはparams [:messages]を受信して​​いないことに注意してください。URLが次のようになっていない限り、users/1?messages=fooそのparams値は常にnilになります。

于 2012-04-22T22:52:54.897 に答える
1

ショーページで、隠しフィールドに入れます。

<%= form_for([current_user, @message])  do |form| %>
  <%= form.hidden_field :to_id, :value => @user.id %>
于 2012-04-22T22:55:13.727 に答える