我在应用程序中使用rails中的邮箱gem。它显示了如何创建一个邮箱页面,我可以在其中向其他用户发送邮件。但我想知道如何为其他页面添加这些选项。
例如,用户个人资料页面上的发送消息按钮(向该用户发送消息)。
允许用户向帖子/故事的海报发送消息(来自故事宝石)。
等。
我该怎么做?
答案 0 :(得分:0)
本教程的附录涵盖了您所寻求的大部分内容,但将按钮添加到用户索引页面。基于作者的方法,这里是专门针对您的查询的答案。这是假设你完成了原始教程,它工作正常。
在messages_controller' new'动作,创建一个名为@chosen_recipient的实例变量,该变量从查询字符串中获取用户ID(如果存在)。路径后面的查询字符串的格式是?key = value,所以像localhost:3000 / messages / new?to = 1。
# app/controllers/messages_controller.rb
def new
@chosen_recipient = User.find_by(id: params[:to].to_i) if params[:to]
end
更改新邮件表单的收件人选择标记,以将@chosen_recipient参数传递给recipients_options帮助程序方法。
# app/views/messages/new.html.erb
<div class="form-group">
<%= label_tag 'recipients', 'Choose recipients' %>
<%= select_tag 'recipients', recipients_options(@chosen_recipient), multiple: true, class: 'form-control chosen-it' %>
</div>
修改recipients_options帮助程序方法,从用户页面中预选用户作为收件人,作为@chosen_recipient参数传入。
# app/helpers/messages_helper.rb
def recipients_options(chosen_recipient = nil)
s = ''
User.all.each do |user|
s << "<option value='#{user.id}' data-img-src='{gravatar_image_url(user.email, size: 50)}'
#{'selected' if user == chosen_recipient}>#{user.name}</option>"
end
s.html_safe
end
然后在您的用户显示页面中,向新消息路径添加一个按钮,将user.id作为查询字符串传递给URL,并将其添加到URL的末尾。这将由messages_controller&#39; new&#39;提取。上面创建的行动。将其包装成除非有条件排除current_user,否则他们不会最终向自己发送消息。
# app/views/users/show.html.erb
<% unless current_user == @user %>
<%= link_to 'Send message', new_message_path(to: @user.id), class: 'btn btn-default btn-sm' %>
<% end %>
同样对于帖子,假设@ post.user是作者:
# app/views/posts/show.html.erb
<% unless current_user == @post.user %>
<%= link_to 'Send message to author', new_message_path(to: @post.user.id), class: 'btn btn-default btn-sm' %>
<% end %>
<强>附录强>
要使用与上述相同类型的方法将帖子标题添加为邮件主题,请执行以下操作:
将标题添加到帖子/显示页面链接&lt;%= link_to&#39;发送消息&#39;,new_message_path(到:@ user.id,title:@ post.title),类: &#39; btn btn-default btn-sm&#39; %GT;
然后在messages_controller中添加一个实例变量new action @post_title = params [:title]
然后在主题字段的消息/新表单中添加一个值&lt;%= text_field_tag&#39;消息[subject]&#39;,nil,class:&#39; form-control&# 39;,值:@ post_title%&gt;
答案 1 :(得分:0)
我通过遵循Go Rails中的教程,找到了解决方法。我这样做的方法与Steve Carey所做的相同,是通过将
的app / controllers / conversations_controller.rb更改为
def new
@conversation = Mailboxer::Conversation.new
@recipients = User.all - [current_user]
end
def create
recipients = User.where(id: params[:user_ids])
receipt = current_user.send_message(recipients, params[:body], params[:subject])
redirect_to conversation_path(receipt.conversation)
end
到...
def new
@conversation = Mailboxer::Conversation.new
@recipients = User.all - [current_user]
@chosen_recipient = User.find_by(id: params[:to].to_i) if params[:to]
end
def create
recipients = User.where(id: params['recipients'])
receipt = current_user.send_message(recipients, params[:body], params[:subject])
redirect_to conversation_path(receipt.conversation)
end
当然也可以通过在app/helpers/conversations_helper.rb and app/views/conversations/new.html.erb
而不是app/helpers/messages_helper.rb and app/views/messages/new.html.erb.
中将receives_options帮助方法和@chosen_recipient参数放置到