Mailboxer: Ссылка для отправки сообщения со страницы профиля (Devise)

Использование Mailboxer для создания внутренней системы обмена сообщениями, в которой пользователь может отправлять сообщения другому пользователю из списка базовых профилей (для тех, кто их создал).

Индекс, показывающий список basic_profiles (экспертов), отображается, но ссылка на создание нового сообщения не передает параметры для создания нового сообщения.

Вот список экспертов, в котором перечислены основные профили и ссылка, по которой текущий пользователь может отправить новое сообщение пользователю, у которого есть базовый профиль:

<div style="margin-top:100px;">
 <h3>Experts</h3>
  <% BasicProfile.all.each do |basic_profile| %>
    <div>
      <p style="padding-top:20px;"> <img src="<%= basic_profile.picture_url %>"    
      style="float: left;margin: 5px;"> 
      <span style="font-size:14px;"><b>
      <%= basic_profile.first_name %> <%= basic_profile.last_name %></b></span></><br>
      <b><i><%= basic_profile.headline %></i></b><br>
      <%= basic_profile.location %><br>
      <%= basic_profile.industry %><br>
      <%= basic_profile.specialties %><br>
      <%= button_to "Send a message", new_message_path(@user) %></p>
   </div>
 <% end %>
</div>

Вот контроллер экспертов:

class ExpertsController < ApplicationController
  def index
    @basic_profiles = BasicProfile.all
    @user = User.all
  end
end

Вот контроллер сообщений:

class MessagesController < ApplicationController

  # GET /message/new
    def new
      @user = User.find_by_email(params[:user])
      @message = current_user.messages.new
    end

  # POST /message/create
   def create
      @recipient = User.find_by_email(params[:user])
      current_user.send_message(@recipient, params[:body], params[:subject])
      flash[:notice] = "Message has been sent!"
      redirect_to :conversations
    end
  end

Вот вид нового сообщения:

 <div style="margin-top:200px;">

   Send a message to

    <%= @user.email %>
    <%= form_tag({controller: "messages", action: "create"}, method: :post) do %>
    <%= label_tag :subject %>
    <%= text_field_tag :subject %>
    <%= label :body, "Message text" %>
    <%= text_area_tag :body %>
    <%= hidden_field_tag(:user, "#{@user.id}") %>
    <%= submit_tag 'Send message', class: "btn btn-primary" %>
   <% end %>
 </div>

Вот что находится в маршрутах для сообщений:

 resources :messages do
    collection do
      post 'new/:user', to: 'messages#create'
    end
    member do
      post :reply
      post :trash
      post :untrash
      post :new
   end

Девайс используется.

Мне интересно, почему параметры не передаются в представление для нового сообщения.


person user3686578    schedule 02.06.2014    source источник


Ответы (1)


Будучи опубликованным месяц назад, я не уверен, что вы поняли это, но я наткнулся на этот вопрос, пытаясь решить свою собственную проблему с Mailboxer.

У меня есть сценарий, аналогичный вашему, когда я хотел, чтобы кнопка отправляла сообщение пользователю на его странице. В моем представлении для нового сообщения такое же скрытое_поле, как и у вас.

<%= hidden_field_tag(:user, "#{@user.id}") %>

Однако мое новое сообщение link_to (где у вас есть button_to) немного отличается. Вместо передачи объекта @user я передаю идентификатор пользователя).

<%= link_to "Message This User", new_message_path(:user => @user.id), class: "btn btn-large btn-primary" %>

Затем в messages_controller я использую find_by(id: вместо find_by_email, который у вас есть.

Сообщения Новое действие

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

это то, что передается в hidden_field. Как вы можете видеть выше, снова передает только идентификатор пользователя в качестве параметра :user в действие создания.

Оттуда у нас есть действие создания сообщений.

@recipient = User.find_by(id: params[:user])
current_user.send_message(@recipient, params[:body], params[:subject])     

В любом случае, не уверен, что это поможет, но вот.

person FreemanC    schedule 23.07.2014