ruby-on-rails - 在 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 = ....
解决了这个问题
解决方案
您在控制器的对话变量中缺少 @ ,并且您的变量超出了范围。
@conversation = Private::Conversation.new(sender_id: current_user.id, recipient_id: recipient_id
推荐阅读
- python - 如何在 Pyspark 中过滤数据框
- python - 需要一个有效的算法来根据规格移动游戏块(游戏:Janggi)
- flutter - 颤振 2.0.1 发布失败
- angular - 令牌服务,令牌拦截器帮助,令牌未存储,Angular 10
- javascript - 有没有办法使反应语义ui中的动画平滑?
- razor - 如何在 Blazor Webassembly 中完全禁用组件
- python - re 和 TypeError 的问题:预期的字符串或类似字节的对象
- angular - 在 onLazyLoad 事件中设置排序会触发 p-table 上的无限循环
- html - 文本框大小更改时光标位置更改
- r - 在 purrr::map() 中使用常量作为函数参数