我正在尝试使用消息传递功能(使用acts-as-messageable gem)并且我希望用户无需输入“:to”字段即可发送消息。
在我的/users/show.html.erb中我有:
<%= link_to 'Send a message', new_message_path %>
在我的/messages/new.html.erb中:
<%= simple_form_for @message, :url => messages_path, :method => :post do |f| %>
<%= hidden_field_tag :user_id %>
<%= f.input :body %>
<%= f.submit %>
<% end %>
我的消息控制器:
def new
@message = ActsAsMessageAble::Message.new
end
def create
@to = User.find(params[:user_id])
current_user.send_message(@to, params[:body])
end
在我提交表单的那一刻,Rails显然找不到id = nothing 的用户,因为没有param [:user_id]存在。
我无法弄清楚如何将param传递给表单中的hidden_field_tag?
感谢您的帮助。
答案 0 :(得分:3)
所以我想要做的是访问用户个人资料,点击发送消息,并能够编写消息并让它自动发送给用户,而无需明确规定:to field。
问题是:<%= hidden_tag_field :user_id %>
中的user_id未设置。换句话说,我不能从那个形式的params得到:user_id。
我们尝试过的一些解决方案是将params包含在link_to中,但是对于将对象视为nil的形式而言并不合适。
我最终做的是创建一个嵌套资源,如下所示:
resources :users do
resources :messages do
end
end
这最终给了我url:users /:id / messages / new(new_user_message_path
)
我的控制器最终看起来像这样:
def new
@message = ActsAsMessageable::Message.new
@user = params[:user_id]
end
def create
@to = User.find params[:id]
if current_user.send_message(@to, params[:acts_as_messageable_message][:body]
flash[:notice] = "Success"
else
flash[:error] = "Fail"
end
end
在表单中,我能够按原样离开<%= hidden_tag_field :user_id %>
。
但基本上解决了找到用户(我正在访问其个人资料)并在我的创建操作中设置@to的问题。
答案 1 :(得分:1)
我在我的iPhone上对于简短回复感到抱歉,您只需要将用户ID传递到隐藏字段,您可以在答案中找到语法:
rails - what exactly does hidden_field and hidden_field_tag do?
编辑:刚注意到 - 这个 &lt;%= hidden_field_tag:user_id%&gt;
应该是这样的: &lt;%= f.hidden_field_tag:user_id%&gt;
尝试将params传递给create方法,如下所示:
User.find(PARAMS [:消息] [:USER_ID])