kaminari分页ajax调用呈现给错误的控制器

时间:2014-02-28 14:34:40

标签: ruby-on-rails ajax rails-routing kaminari

首先,我们从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
...

1 个答案:

答案 0 :(得分:2)

即使您正在从对话路径中呈现视图和部分内容,您甚至都没有触及ConversationController

您可以为正在执行的操作呈现所需的任何视图。连接ConversationControllerviews/conversation/file.html.erb以及类似视图文件的唯一方法是松散的命名约定。当从render 'index'的操作中渲染出ConversationController时,它只是假定您使用views/conversation/index.html.erb文件。

您的视图或部分单独无法引用它所属的控制器(按命名约定时),因为它仅在您的操作中由render命令用作模板。视图不关心它后面的控制器是否合适。在这种情况下,render最初是在MessagesController中执行的,因此视图也只是对该视图的引用。

要让链接指向正确的控制器,您需要指定要用于网址的控制器。否则,假设您要使用与渲染页面相同的控制器。

罪魁祸首可能是kaminari在link_to_previous_pagelink_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'}