(неопределенный метод `receipts_for' для nil:NilClass - MailBoxer Gem Rails

Я использую гем mailboxer для создания системы обмена сообщениями между пользователями для моего приложения rails. По какой-то причине я получаю эту ошибку:

(неопределенный метод `receipts_for' для nil:NilClass)

Может быть, это потому, что я должен определить «receipts_for» где-то в моем контроллере или в mailboxer.rb? Я пробовал несколько вещей.. но, к сожалению, ни одна из них не увенчалась успехом.

Это мои маршруты.rb:

Rails.application.routes.draw do
  root   'static_pages#home'
  get    '/help',    to: 'static_pages#help'
  get    '/about',   to: 'static_pages#about'
  get    '/contact', to: 'static_pages#contact'
  get    '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  get    'search/index'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users do
    member do
      get :following, :followers
    end
  end
  resources :conversations do
    resources :messages
  end
  resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]
  resources :microposts,          only: [:create, :destroy]
  resources :relationships,       only: [:create, :destroy]
  resources :searches
end

Это мой контроллер разговоров:

class ConversationsController < ApplicationController

  def show
    @conversation = current_user.mailbox.conversation.find(params[:id])
  end


  def new
    @recipients = User.find(params[:user_id])
  end

  def create
    recipient = User.find(params[:user_id])
    receipt = current_user.send_message(recipient, params[:body])
    redirect_to conversation_path(receipt.conversation)
  end

end

Это мой messages_controller:

class MessagesController < ApplicationController
  before_action :set_conversation

  def create
    receipt = current_user.send_message(@conversation, body)
    redirect_to receipt.conversation
  end

  private

  def set_conversation
    @conversation = current_user.mailbox.conversations.find(params[:conversation_id])
  end

end

Система обмена сообщениями, которую я создаю, представляет собой систему обмена сообщениями, в которой «current_user» может перейти на страницу профиля любого пользователя в приложении и отправить ему/ей сообщение через страницу профиля. Это означает, что я визуализирую show.html.erb модели диалога внутри show.html.erb модели моих пользователей. Вот код обоих представлений:

show.html.erb — модель пользователей:

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="col-md-4">
    <section>
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
    <section class="stats">
      <%= render 'shared/stats' %>
    </section>
      <h6>
        <%= @user.gender %>
      </h6>
    <%= render "conversations/conversation" %>
  </aside>
  <div class="col-md-8">
    <%= render 'follow_form' if logged_in? %>
    <% if @user.microposts.any? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
      <ol class="microposts">
        <%= render @microposts %>
      </ol>
      <%= will_paginate @microposts %>
    <% end %>
  </div>
</div>

_conversation.html.erb — показать представление модели разговоров.

<% @conversation.receipts_for(current_user).each do |receipt| %>
    <div>
        <%= receipt.message.body %>
    </div>
<% end %>


<%= form_tag conversation_messages_path(@conversation), method: post do  %>
    <div>
        <%= text_area_tag :body %>
    </div>

    <%= submit_tag %>
<% end %>

Итак, как именно я могу определить метод 'receipts_for' для моего почтового ящика? Или что-то еще не так с моим кодом?

Любая помощь приветствуется!

Спасибо!


person Aly Dabbous    schedule 28.05.2018    source источник
comment
Итак, GET /users/:id (т.е. UsersController#show) использует это представление show.html.erb, а это представление использует частичное представление _conversation.html.erb? Но UsersController#show не устанавливает @conversation? Кстати, я обычно считаю, что использование переменных экземпляра для туннелирования информации в партиалы просто приводит к боли и страданиям, вещи легче понять, когда вы более подробно описываете, как перемещаются данные.   -  person mu is too short    schedule 28.05.2018
comment
Никакой show.html модели пользователей не отображает show.html разговоров_контроллера. Вот и все. Почему мне нужно установить @conversation в UsersController#show?   -  person Aly Dabbous    schedule 28.05.2018
comment
@muistooshort отмечает тебя   -  person Aly Dabbous    schedule 28.05.2018
comment
Единственный вызов receipts_for, который у вас есть, — это @conversation.receipts_for в партиале, единственное, что я вижу, которое использует этот партиал, — это show.html.erb для (очевидно) ваших пользователей. Ошибка говорит вам, что @conversation равно nil в частичном. show.html модели Users отображает show.html разговоров_контроллера, для меня это не имеет смысла; модели ничего не отображают, это делают контроллеры; методы в ConversationsController визуализируют представления из app/views/conversations/, если только вы не сделаете специальные приготовления.   -  person mu is too short    schedule 28.05.2018


Ответы (1)


Я вернусь к тому, что сказал @mu is too short. Важно обратить внимание на все сообщение об ошибке. «неопределенный метод квитанции_для nil:NilClass» сообщает вам, что получатель метода receipts_for является nil. @conversation.receipts_for(current_user) выглядит единственным местом, где используется receipts_for, поэтому я бы начал отладку, убедившись, что @conversation присвоено значение существующего объекта диалога, поддерживаемого ActiveRecord.

Кажется, слишком много всего происходит, поэтому я не знаю, как предложить вам быстрое решение. Присвоение значения в вашем методе ConversationsController#show @conversation= current_user.mailbox.conversation.find(params[:id]) выглядит громоздко. Это наводит меня на мысль, что вы ищете conversation на основе mailbox, принадлежащего current_user, что может быть тем, что вам нужно (в этом случае вам нужно иметь соответствующий ассоциации, определенные в ваших моделях).

Однако, поскольку цепочка заканчивается на conversation.find(params[:id]), я предполагаю, что current_user.mailbox не нужен. В качестве альтернативы, если у вашего params на самом деле нет идентификатора разговора, возможно, вам нужно сосредоточиться на этом.

Хорошая новость заключается в том, что вы, вероятно, сможете понять, как определить @conversation, если вы вставите byebug (или binding.pry, в зависимости от того, что вы установили) в верхней части вашего метода show и в вашем частичном представлении :

# In the controller:

  def show
    binding.pry
    @conversation = current_user.mailbox.conversation.find(params[:id])
  end


# in the view
<% binding.pry %>
person Ginnie Hench    schedule 28.05.2018
comment
Привет @Ginnie :) Спасибо за помощь. Я постепенно пытаюсь понять проблему и причину ошибки. Но не могли бы вы подробнее рассказать о том, что вы имеете в виду: это наводит меня на мысль, что вы ищете беседу, основанную на почтовом ящике, принадлежащем current_user, что может быть тем, что вам нужно (в этом случае ваши модели должны иметь соответствующие ассоциации определенный). Какие именно ассоциации я должен вызвать в модели? А какая именно модель? Модель пользователя? Или модель разговора? Извините, если я не понимаю этого! И спасибо за терпение ко мне. Я еще новичок во всем этом! - person Aly Dabbous; 29.05.2018
comment
После публикации своего комментария я наткнулся на выпуск Go Rails, в котором реализован тот же гем почтового ящика. У автора есть ссылка на исходный код, чтобы вы могли увидеть, как они все настроили. Они используют то же присвоение значений, что и вы, так что вы, вероятно, можете проигнорировать мой совет о громоздком присвоении значений для этой конкретной проблемы. Эпизод: gorails.com/episodes/in-app-messaging-between-users Код на GitHub: github .com/gorails-screencasts/gorails-episode-105/blob/master/ - person Ginnie Hench; 29.05.2018
comment
Если вы новичок в Rails, я бы потратил время на то, чтобы понять, как настроить ассоциации has_many и own_to, и посмотреть, какие методы вы получаете, когда эти ассоциации настроены должным образом. - person Ginnie Hench; 29.05.2018