На Ruby-on-Rails можно передавать переменные из контроллера для просмотра через response_to? - PullRequest
0 голосов
/ 23 января 2019

Я хочу отправить сообщение и после этого показать сообщение и открыть всплывающее окно. Сообщение должным образом сохранено в базе данных, но сообщение не отображается, вместо этого я получаю это

NoMethodError in Private::Conversations#create
Showing /var/www/appror/app/views/private/conversations/_open.js.erb where line #3 raised:
undefined method `id' for nil:NilClass`

Приложение работает на

Rails version             5.2.2;
Ruby version              2.5.3-p105 (x86_64-linux);
RubyGems version          2.7.6;
Rack version              2.0.6

после сохранения сообщения в контроллере

/app/channels/private/conversation_channel.rb

class Private::ConversationsController < ApplicationController    
    def create
        recipient_id = Post.find(params[:post_id]).user.id
        conversation = Private::Conversation.new(sender_id: current_user.id, recipient_id: recipient_id)
        if conversation.save

            respond_to do |format|
                format.js {render partial: 'posts/show/contact_user/message_form/success'}
        end
....
end

от

/app/views/posts/show/contact_user/message_form/_success.js.erb

где это

<%= render 'private/conversations/open' %>

должно отобразиться сообщение

/app/views/private/conversations/_open.js.erb

, где

var conversation = $('body').find("[data-pconversation-id='" + 
                            "<%= @conversation.id %>" + 
                            "']");

Обычно он должен идти вперед и показывать сообщение и всплывающее окно, но вместо этого я получаю

NoMethodError in Private::Conversations#create
Showing /var/www/appror/app/views/private/conversations/_open.js.erb where line #3 raised:
undefined method `id' for nil:NilClass`

После отладки я увидел, что <% = @conversation%> пусто ... так что, имеет смысл ошибка. Но как я могу передать @conversatio от контроллера для просмотра? Это можно передать с помощью

respond_to do |format| format.js

Спасибо!

EDIT:

спасибо @max, действительно @conversation = .... решили проблему

1 Ответ

0 голосов
/ 23 января 2019

В переменной разговора в контроллере отсутствует @, и ваша переменная выходит за рамки видимости. @conversation = Private::Conversation.new(sender_id: current_user.id, recipient_id: recipient_id

...