首先,我们从conversation / index.html.haml开始创建消息
#new_message_conversation
.panel.panel-info
.panel-heading
%h4 Send a Bark!
.panel-footer(style="padding-top: 20px")
= simple_form_for :message, url: :messages, :remote => true do |f|
.form-group
= f.input :master_name, placeholder: 'Choose master...', label: false, :url => autocomplete_master_name_conversations_path, :as => :autocomplete, id_element: "#master_name_id", input_html: {class: "form-control"}
= f.input :recipient_id, as: "hidden", input_html: {id: "master_name_id"}
= f.input :body, label: false, as: "text", placeholder: 'Write message...', :input_html => { :rows => 5 }
= f.button :submit, 'Send', :class => "btn btn-lg btn-primary", :disable_with => "Sending..."
然后进入消息#create action
...
respond_to do |format|
format.js { render "create", locals: { conversation: @conversation, conversations: @conversations, receipts: @receipts }}
end
...
将工作发送到conversations / create.js.erb文件
$('#new_message_conversation').prop('disabled', true).html("<%= raw escape_javascript(render(:partial => 'conversations/show', locals: { conversation: conversation, receipts: receipts })) %>").hide().fadeIn('fast');
添加了对话/ show partial,_show.html.haml,其中包含
...
%ul.pager.pull-left(style= "padding-left: 10px")
%li#paginator_3= link_to_previous_page @receipts, "Newer", :remote => true, :param_name => 'page_2'
%li#paginator_4= link_to_next_page @receipts, "Older", :remote => true, :param_name => 'page_2'
...
一切正常,现在分页按钮不起作用。当我点击分页按钮时,服务器说
Rendered messages/index.js.erb
为什么具有远程ajax调用的视图/会话中的部分内容会呈现给不同的控制器(消息)?它应该是渲染conversations / show.js.erb,因为部分是会话/ _show.html.haml对吗?
这里也是我的路线
...
resources :conversations do
get :autocomplete_master_name, :on => :collection
end
resources :messages
...
答案 0 :(得分:2)
即使您正在从对话路径中呈现视图和部分内容,您甚至都没有触及ConversationController
。
您可以为正在执行的操作呈现所需的任何视图。连接ConversationController
和views/conversation/file.html.erb
以及类似视图文件的唯一方法是松散的命名约定。当从render 'index'
的操作中渲染出ConversationController
时,它只是假定您使用views/conversation/index.html.erb
文件。
您的视图或部分单独无法引用它所属的控制器(按命名约定时),因为它仅在您的操作中由render
命令用作模板。视图不关心它后面的控制器是否合适。在这种情况下,render
最初是在MessagesController
中执行的,因此视图也只是对该视图的引用。
要让链接指向正确的控制器,您需要指定要用于网址的控制器。否则,假设您要使用与渲染页面相同的控制器。
罪魁祸首可能是kaminari在link_to_previous_page
和link_to_next_page
助手的某个地方。使用完整的paginate
帮助程序时,您可以像这样设置要使用的控制器和操作:
<%= paginate @users, :params => {:controller => 'foo', :action => 'bar'} %>
文档(这里:https://github.com/amatsuda/kaminari)没有说明这个参数是否也可以与其他帮助者一起使用,但帮助者使用简单的link_to
(参见此处:https://github.com/amatsuda/kaminari/blob/master/lib/kaminari/helpers/action_view_extension.rb) ,所以你应该能够做这样的事情:
link_to_previous_page @receipts, "Newer", {:controller => 'foo', :action => 'bar', :remote => true, :param_name => 'page_2'}