Rails 创建操作 Ajax returns 模板丢失或格式未知
Rails create action Ajax returns Template Missing or Unknown Fomat
我正在尝试在一对一聊天应用程序上实现 private_pub,没有 private_pub 一切正常,只是不理想的聊天应用程序,因为没有 websocket 用于自动更新。
我尝试在 private_pub 的 RailsCasts 上实施,但我收到模板丢失或格式未知的问题。
这是我的代码:
路线
resources :conversations do
resources :messages
end
我的用户显示页面中有一个开始聊天的按钮(其中 creates/uses 一个对话并显示一个对话显示页面,例如 facebook/gchat 上的一对一聊天框,一个对话有很多消息):
<% unless current_user == @user %>
<%= link_to "Send Message", conversations_path(:sender_id => current_user.id , :recipient_id => @user.id ), :method => :post, class: "btn btn-success btn-xs start-conversation" %>
<% end %>
对话控制器
class ConversationsController < ApplicationController
before_filter :authenticate_user!
layout false
def create
if Conversation.between(params[:sender_id],params[:recipient_id]).present?
@conversation = Conversation.between(params[:sender_id],params[:recipient_id]).first
else
@conversation = Conversation.create!(conversation_params)
end
@conversation.save!
redirect_to @conversation
end
def show
@conversation = Conversation.find(params[:id])
@reciever = interlocutor(@conversation)
@messages = @conversation.messages
@message = Message.new
end
private
def conversation_params
params.permit(:sender_id, :recipient_id)
end
def interlocutor(conversation)
current_user == conversation.recipient ? conversation.sender : conversation.recipient
end
end
对话展示视图
<% content_for :bottom do %>
<%= subscribe_to conversation_path(@conversation) %>
<% end %>
<div class="chatboxhead">
<div class="chatboxtitle">
<i class="fa fa-comments"></i>
<h1><%= @reciever.username %> </h1>
</div>
<div class="chatboxoptions">
<%= link_to "<i class='fa fa-minus'></i> ".html_safe, "#", class: "toggleChatBox", "data-cid" => @conversation.id %>
<%= link_to "<i class='fa fa-times'></i> ".html_safe, "#", class: "closeChat", "data-cid" => @conversation.id %>
</div>
<br clear="all"/>
</div>
<div class="chatboxcontent">
<% if @messages.any? %>
<%= render @messages.reverse %>
<% end %>
</div>
<div class="chatboxinput">
<%= form_for([@conversation, @message], :remote => true) do |f| %>
<%= f.text_area :body, class: "chatboxtextarea", "data-cid" => @conversation.id %>
<%= f.submit " Send", class: "btn btn-primary btn-xs"%>
<% end %>
</div>
消息控制器
class MessagesController < ApplicationController
before_filter :authenticate_user!
skip_before_filter :verify_authenticity_token, only: [:create]
def create
@conversation = Conversation.find(params[:conversation_id])
@message = @conversation.messages.build(message_params)
@message.user_id = current_user.id
@message.save!
@path = conversation_path(@conversation)
end
private
def message_params
params.require(:message).permit(:body)
end
end
留言的留言部分
#_message.html.erb
<li class="<%= self_or_other(message) %>">
<div class="avatar">
<img src="http://placehold.it/50x50" />
</div>
<div class="chatboxmessagecontent">
<p><%= message.body %></p>
<time datetime="<%= message.created_at %>" title="<%= message.created_at.strftime("%d %b %Y at %I:%M%p") %>">
<%= message_interlocutor(message).username %> <%= message.created_at.strftime("%H:%M %p") %>
</time>
</div>
</li>
消息的创建视图
#create.js.erb
<% publish_to @path do %>
var id = "<%= @conversation.id %>";
var chatbox = $(".chatboxcontent");
var sender_id = "<%= @message.user.id %>";
var reciever_id = $('meta[name=user-id]').attr("content");
chatbox.append("<%= j render( partial: @message ) %>");
chatbox.scrollTop(chatbox[0].scrollHeight);
if (sender_id != reciever_id) {
chatBox.chatWith(id);
chatbox.children().last().removeClass("self").addClass("other");
chatbox.scrollTop(chatbox[0].scrollHeight);
chatBox.notify();
}
<% end %>
在消息控制器上,创建以上代码结果的操作 "Missing Template" 如果我将 respond_to 设为:
respond_to do |format|
format.js { render 'create.js.erb' }
end
结果"Unknown Format"
当您没有添加 jquery_ujs
文件时会发生此错误。您只包含了 jquery 文件。
因此您需要在视图中手动添加这两个文件,或者在 application.js
或您用于特定布局的任何其他文件中需要它们。
根据您的情况,您可以采用第一种或第二种解决方案。
第一个解决方案:
<%= javascript_include_tag :jquery, :jquery_ujs %>
在你的对话显示页面上。
第二种解决方案:
删除对话控制器上的 "layout false"
我正在尝试在一对一聊天应用程序上实现 private_pub,没有 private_pub 一切正常,只是不理想的聊天应用程序,因为没有 websocket 用于自动更新。 我尝试在 private_pub 的 RailsCasts 上实施,但我收到模板丢失或格式未知的问题。 这是我的代码:
路线
resources :conversations do
resources :messages
end
我的用户显示页面中有一个开始聊天的按钮(其中 creates/uses 一个对话并显示一个对话显示页面,例如 facebook/gchat 上的一对一聊天框,一个对话有很多消息):
<% unless current_user == @user %>
<%= link_to "Send Message", conversations_path(:sender_id => current_user.id , :recipient_id => @user.id ), :method => :post, class: "btn btn-success btn-xs start-conversation" %>
<% end %>
对话控制器
class ConversationsController < ApplicationController
before_filter :authenticate_user!
layout false
def create
if Conversation.between(params[:sender_id],params[:recipient_id]).present?
@conversation = Conversation.between(params[:sender_id],params[:recipient_id]).first
else
@conversation = Conversation.create!(conversation_params)
end
@conversation.save!
redirect_to @conversation
end
def show
@conversation = Conversation.find(params[:id])
@reciever = interlocutor(@conversation)
@messages = @conversation.messages
@message = Message.new
end
private
def conversation_params
params.permit(:sender_id, :recipient_id)
end
def interlocutor(conversation)
current_user == conversation.recipient ? conversation.sender : conversation.recipient
end
end
对话展示视图
<% content_for :bottom do %>
<%= subscribe_to conversation_path(@conversation) %>
<% end %>
<div class="chatboxhead">
<div class="chatboxtitle">
<i class="fa fa-comments"></i>
<h1><%= @reciever.username %> </h1>
</div>
<div class="chatboxoptions">
<%= link_to "<i class='fa fa-minus'></i> ".html_safe, "#", class: "toggleChatBox", "data-cid" => @conversation.id %>
<%= link_to "<i class='fa fa-times'></i> ".html_safe, "#", class: "closeChat", "data-cid" => @conversation.id %>
</div>
<br clear="all"/>
</div>
<div class="chatboxcontent">
<% if @messages.any? %>
<%= render @messages.reverse %>
<% end %>
</div>
<div class="chatboxinput">
<%= form_for([@conversation, @message], :remote => true) do |f| %>
<%= f.text_area :body, class: "chatboxtextarea", "data-cid" => @conversation.id %>
<%= f.submit " Send", class: "btn btn-primary btn-xs"%>
<% end %>
</div>
消息控制器
class MessagesController < ApplicationController
before_filter :authenticate_user!
skip_before_filter :verify_authenticity_token, only: [:create]
def create
@conversation = Conversation.find(params[:conversation_id])
@message = @conversation.messages.build(message_params)
@message.user_id = current_user.id
@message.save!
@path = conversation_path(@conversation)
end
private
def message_params
params.require(:message).permit(:body)
end
end
留言的留言部分
#_message.html.erb
<li class="<%= self_or_other(message) %>">
<div class="avatar">
<img src="http://placehold.it/50x50" />
</div>
<div class="chatboxmessagecontent">
<p><%= message.body %></p>
<time datetime="<%= message.created_at %>" title="<%= message.created_at.strftime("%d %b %Y at %I:%M%p") %>">
<%= message_interlocutor(message).username %> <%= message.created_at.strftime("%H:%M %p") %>
</time>
</div>
</li>
消息的创建视图
#create.js.erb
<% publish_to @path do %>
var id = "<%= @conversation.id %>";
var chatbox = $(".chatboxcontent");
var sender_id = "<%= @message.user.id %>";
var reciever_id = $('meta[name=user-id]').attr("content");
chatbox.append("<%= j render( partial: @message ) %>");
chatbox.scrollTop(chatbox[0].scrollHeight);
if (sender_id != reciever_id) {
chatBox.chatWith(id);
chatbox.children().last().removeClass("self").addClass("other");
chatbox.scrollTop(chatbox[0].scrollHeight);
chatBox.notify();
}
<% end %>
在消息控制器上,创建以上代码结果的操作 "Missing Template" 如果我将 respond_to 设为:
respond_to do |format|
format.js { render 'create.js.erb' }
end
结果"Unknown Format"
当您没有添加 jquery_ujs
文件时会发生此错误。您只包含了 jquery 文件。
因此您需要在视图中手动添加这两个文件,或者在 application.js
或您用于特定布局的任何其他文件中需要它们。
根据您的情况,您可以采用第一种或第二种解决方案。
第一个解决方案:
<%= javascript_include_tag :jquery, :jquery_ujs %>
在你的对话显示页面上。
第二种解决方案:
删除对话控制器上的 "layout false"