(неопределенный метод 'receivets_for' для nil: NilClass - MailBoxer Gem Rails - PullRequest
0 голосов
/ 28 мая 2018

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

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

Может быть, это потому, что я должен определить 'receivets_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

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

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

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

Любая помощь будет высоко ценится!

Спасибо!

1 Ответ

0 голосов
/ 29 мая 2018

Я вернусь к тому, что @ mu слишком короткое .Важно обратить внимание на все сообщение об ошибке.«Undefined method receivets_for for 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...