首页 > 解决方案 > 在 Ruby-on-Rails 上,可以通过 respond_to 将变量从控制器传递到视图吗?

问题描述

我想提交一条消息,然后显示一条消息并打开一个弹出窗口。该消息已正确保存在数据库中,但该消息未显示,而是我收到此消息

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

?

谢谢!

编辑:

谢谢@max,确实@conversation = ....解决了这个问题

标签: ruby-on-railsrespond-to

解决方案


您在控制器的对话变量中缺少 @ ,并且您的变量超出了范围。 @conversation = Private::Conversation.new(sender_id: current_user.id, recipient_id: recipient_id


推荐阅读