2015-11-09 1 views
1

J'ai essayé de personnaliser la gemme Mailboxer pour répondre à mes besoins. Il y a d'autres publications SO qui font référence à des fonctionnalités similaires, mais je voulais poser cette question car elle est quelque peu différente.Personnalisation de la gemme Mailboxer - Rails 4 - Envoyer un message lié à une liste

I mes messages Controller remaniée avec de ceci:

def new 
    @user = User.find_by(id: params[:user]) 
end 

def create 
    recipients = User.where(id: params['recipients']) 
    conversation = current_user.send_message(recipients, params[:message][:body], params[:message][:subject]).conversation 
    flash[:success] = "Message has been sent!" 
    redirect_to conversation_path(conversation) 
end 

Pour:

def new 
    @user = User.find_by(id: params[:user]) 
    @message = current_user.messages.new 
    @listing = Listing.find_by(id: params[:listing]) 
end 

def create 
    @recipient = User.find_by(id: params[:user]) 
    conversation = current_user.send_message(@recipient, "Hello", "Subject").conversation 
    flash[:notices] = ["Your message was successfully sent to the seller"] 
    redirect_to root_path 
end 

Je puis également ajouté aux messages/new.html.erb:

Send a message to 
<%= @user.email %> 
<%= form_tag({controller: "messages", action: "create"}, method: :post) do %> 
    <%= hidden_field_tag(:listing, "#{@listing.id}") %> 
    <%= hidden_field_tag(:user, "#{@user.id}") %> 
    <%= submit_tag 'Send Message', class: "btn btn-primary" %> 
<% end %> 

Cela permet moi pour accéder à l'objet utilisateur auquel j'envoie le message ainsi que l'identifiant de la liste afin que le message puisse être lié à une liste.

Github repo: https://github.com/benhawker/rails_marketplace/tree/master/app

Le modèle utilisateur comprend: acts_as_messageable

Je ne tire aucune erreur, mais après avoir validé dans les rails console de l'utilisateur que je cherchais à envoyer le message à a nul Si quelqu'un qui a essayé de faire la même chose avec Mailboxer est capable d'expliquer où je me trompe, je l'apprécierais vraiment.

conversation = current_user.send_message(@recipient, "Hello", "Subject").conversation 

Je suis conscient du fait que cette ligne est probablement la clé - Je ne comprends pas bien le but du .conversation après avoir passé les arguments dans la méthode send_message la gemme Mailboxer offre.

Répondre

1

Je voulais poster ma solution éventuelle à cela. J'ai fini par rouler ma propre solution de messagerie en m'inspirant de cet excellent article sur Medium https://medium.com/@danamulder/tutorial-create-a-simple-messaging-system-on-rails-d9b94b0fbca1.

Il est loin d'être parfait et il y a une quantité importante de refactoring dans le Inquiries Controller qui doit se produire mais il est fonctionnel et résout ma question originale.

Créer une classe d'enquête avec les associations suivantes.

class Inquiry < ActiveRecord::Base 
    belongs_to :listing 
    belongs_to :sender, :foreign_key => :sender_id, class_name: "User" 
    belongs_to :recipient, :foreign_key => :recipient_id, class_name: "User" 
    has_many :messages, dependent: :destroy, validate: false 

    accepts_nested_attributes_for :messages, reject_if: proc { |attributes| attributes["message"].blank? } 

    validates_presence_of :sender, :recipient, :listing 
    validates_uniqueness_of :sender_id, :scope => :recipient_id 

    scope :between, -> (sender_id,recipient_id) do 
    where("(inquiries.sender_id = ? AND inquiries.recipient_id =?) OR (inquiries.sender_id = ? AND inquiries.recipient_id =?)", sender_id,recipient_id, recipient_id, sender_id) 
    end 
end 

Puis une classe de message associée à chaque demande.

class Message < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :inquiry 

    validates_presence_of :body, :inquiry_id, :user_id 
end 

a ensuite créé un InquiriesController

class InquiriesController < ApplicationController 

    def index 
    @users = User.all 
    @inquiries = Inquiry.all 
    end 

    def new 
    @sender = User.find_by(id: params[:sender]) 
    @recipient = User.find_by(id: params[:recipient]) 
    @listing = Listing.find_by(id: params[:listing]) 

    @inquiry = current_user.inquiries.new 
    @message = @inquiry.messages.build 
    end 

    def create 
    @sender = User.find_by(id: params[:sender_id]) 
    @recipient = User.find_by(id: params[:recipient_id]) 
    @listing = Listing.find_by(id: params[:listing_id]) 
    if Inquiry.between(@sender,@recipient).present? 
    @inquiry = Inquiry.between(@sender, @recipient).first 
    else 
    @inquiry = Inquiry.create!(inquiry_params) 
    @inquiry.listing << Listing.find_by(id: params[:listing_id]) 
    end 
    redirect_to inquiry_messages_path(@inquiry) 
end 

private 
def inquiry_params 
    params.permit(:sender_id, :recipient_id, :listing_id) 
end 

Dans ma liste/page show Je passe ensuite par l'expéditeur, le destinataire et la liste id pour renseigner l'objet d'enquête.

<%= link_to "Contact the Seller", inquiries_path(sender_id: current_user.id, recipient_id: @user.id, listing_id: @listing.id), method: 'post' %> 

Ce qui laisse ensuite dans les enquêtes/index:

<% @inquiries.each do |inquiry| %> 
    <% if inquiry.sender_id == current_user.id || inquiry.recipient_id == current_user.id %> 
    <% if inquiry.sender_id == current_user.id %> 
     <% recipient = User.find(inquiry.recipient_id) %> 
    <% else %> 
     <% recipient = User.find(inquiry.sender_id) %> 
    <% end %> 
    <div> 
     <%= link_to "Messages with #{recipient.email} about #{inquiry.listing.title}", inquiry_messages_path(inquiry)%> 
    </div> 
    <% end %> 
<% end %> 
+0

était à la recherche d'une solution pour cela pour les hourras semaines accouple – Abhilash

+0

Je suis heureux de l'entendre! –

+0

ne peux pas le faire fonctionner ..Pourriez-vous s'il vous plaît fournir les autres fichiers pertinents du système de messagerie comme les messages controller, inquiries/new.html.erb, routes fichier etc – Abhilash