【发布时间】:2015-10-20 16:45:50
【问题描述】:
在我的对话索引页面中,我可以单击其中一个对话并远程显示该对话的消息。当消息出现时,有一个表单可以在两个用户之间的同一对话中发送另一条消息。以下是我的设置方式:
对话/index.html.haml
- @conversations.each do |conversation|
= link_to conversation_messages_path(conversation), remote: true do
= conversation.topic
.col-lg-12
#messages-index
消息/_message.html.haml
- @messages.each do |message|
= message.body
= render 'messages/form'
消息/_form.html.haml
= form_for [@conversation, @message], remote: true do |f|
= f.text_area :body
= f.submit "Send"
消息/_index.js.erb
$('#messages-index').empty().append('<%= j render @messages %>')
conversations_controller.rb
class ConversationsController < InheritedResources::Base
def index
@conversations = Conversation.all
end
end
messages_controller.rb
class MessagesController < InheritedResources::Base
def index
@conversation = Conversation.find(params[:conversation_id])
@messages = @conversation.messages
@message = current_user.messages.build
respond_to do |format|
format.js
end
end
def create
@message = current_user.messages.build(message_params)
respond_to do |format|
if @message.save
format.js
else
format.js
end
end
end
end
我的问题是当我尝试发送消息并将新消息发布到对话中时,如下所示:
消息/_create.js.erb
$('#messages-index').replaceWith('<%= j render partial: "message", locals: {message: @message} %>');
这不起作用,因为它会发送 500 内部错误:
Started POST "/conversations/6/messages" for 127.0.0.1 at 2015-10-19 04:37:34 -0700
Processing by MessagesController#create as JS
Parameters: {"utf8"=>"✓", "message"=>{"body"=>"dfdfd"}, "commit"=>"Send", "conversation_id"=>"6"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 4]]
(0.2ms) BEGIN
SQL (15.2ms) INSERT INTO "messages" ("body", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["body", "dfdfd"], ["user_id", 4], ["created_at", "2015-10-19 11:37:34.866111"], ["updated_at", "2015-10-19 11:37:34.866111"]]
(47.8ms) COMMIT
Rendered messages/_message.html.haml (5.7ms)
Rendered messages/create.js.erb (7.8ms)
Completed 500 Internal Server Error in 88ms (ActiveRecord: 63.6ms)
NoMethodError - undefined method `each' for nil:NilClass:
app/views/messages/_message.html.haml:1:in `_app_views_messages__message_html_haml___2837667999247155781_70076471170800'
actionview (4.2.3) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.3) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.3) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.3) lib/action_view/template.rb:143:in `render'
........
那么我怎样才能以正确的方式附加它,以免出现each 错误?
更新
所以我想我必须如何让@messages 超出部分范围。现在是怎么做到的?这就是我的目标:
#messages-index
- @messages.each do |message|
= render message
更新 2
所以我成功解决了接收nil和each的消息的问题。我必须做的是将conversation_id 分配给消息,因为它没有发生,但它仍然没有正确附加。我开始认为你不能这样设置。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4