使用rails中的mailboxer gem添加更多发送选项

时间:2017-04-19 21:54:40

标签: ruby-on-rails mailboxer

我在应用程序中使用rails中的邮箱gem。它显示了如何创建一个邮箱页面,我可以在其中向其他用户发送邮件。但我想知道如何为其他页面添加这些选项。

例如,用户个人资料页面上的发送消息按钮(向该用户发送消息)。

允许用户向帖子/故事的海报发送消息(来自故事宝石)。

等。

我该怎么做?

教程为https://www.sitepoint.com/messaging-rails-mailboxer/

2 个答案:

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

<强>附录

要使用与上述相同类型的方法将帖子标题添加为邮件主题,请执行以下操作:

  1. 将标题添加到帖子/显示页面链接&lt;%= link_to&#39;发送消息&#39;,new_message_path(到:@ user.id,title:@ post.title),类: &#39; btn btn-default btn-sm&#39; %GT;

  2. 然后在messages_controller中添加一个实例变量new action @post_title = params [:title]

  3. 然后在主题字段的消息/新表单中添加一个值&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参数放置到