rails,如何在控制器中检索:id属性

时间:2012-04-22 22:30:40

标签: ruby-on-rails forms controller

我试图创建一个简单的私人消息系统

我有一个嵌套路线

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 %>

当前用户可以向当前正在查看的用户发送私人消息。

在我的留言上。我有......

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. 

有谁知道为什么?

2 个答案:

答案 0 :(得分: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动作未收到任何参数[:messages],因为您不会发布此消息。除非您的网址如下所示:users/1?messages=foo然后该参数值始终为零。

答案 1 :(得分:1)

在您的节目页面上,放入一个隐藏的字段。

<%= form_for([current_user, @message])  do |form| %>
  <%= form.hidden_field :to_id, :value => @user.id %>