0

私が使用しているのは、次のようなブートストラップのページ付けです。

私のモデル:

class Customer < ActiveRecord::Base

  attr_accessible :city, :country, :name, :street, :zip

  //... more code

  has_many :contacts, :dependent => :destroy, :autosave => true

end


class Contact < ActiveRecord::Base
  attr_accessible :name, :notice, :phone

  //... more code

  belongs_to :customer
end

Gemfile:

gem "will_paginate-bootstrap"

部分的に、contacts/_pageable_contacts.html.erb でページ分割された出力を生成できます:

<%
    contacts = contacts.to_a.paginate( :page => params[:page] || 1, :per_page => 5 )
%>
<%= render(:partial => 'contacts/contacts', :locals => {:contacts => contacts})%>
<%= will_paginate contacts, renderer: BootstrapPagination::Rails, remote: true %>

contact/create.js.erb 内での呼び出し:

<%
all = @contact.customer.contacts
%>
<%= render :partial => "contacts/pageable_contacts", :locals => { :contacts => all } %>

will_paginate によって生成されるリンクは、このパーシャルが Contacts コントローラー (例: views/contacts/create.js.erb) のコンテキストでレンダリングされている限り、次のようになります。

customers/3/contacts?page=1
customers/3/contacts?page=2

ここで、このパーシャルを customer/show.html.erb 内で次のようにレンダリングします。

<%= render :partial => 'contacts/pageable_contacts', :object => @customer.contacts, :as => :contacts %>

ただし、will_paginate によって返されるリンクは、連絡先固有ではなく顧客固有のものです。どうやら、will_paginate が self (CustomerController) にアクセスしてリンクを作成しているようです。

customers/3?page=1
customers/3?page=2

partial または will_paginate に対処方法を伝えるにはどうすればよいですか? MVC やルートなどの概念を誤解していませんか? モデル間の関連付けを間違った方法で使用していませんか?

どんな助けでも大歓迎です!ありがとうございます。ゴルビー

4

1 に答える 1

1

will_paginate をデバッグしたところ、self が「テンプレート」として渡されていることがわかりました。

def will_paginate(collection, options = {})
  # early exit if there is nothing to render
  return nil unless collection.total_pages > 1

  options = WillPaginate::ViewHelpers.pagination_options.merge(options)

  #............. more code

  # render HTML for pagination
  renderer.prepare collection, options, self  #####<====== self is Customers Controller
  renderer.to_html
end

私は回避策を見つけました:「レンダリング」メカニズムを使用する代わりに、次のように連絡先コントローラーのインデックスメソッドを呼び出すためにajaxリクエストを使用しています:

I. customers/show.html.erb:

<div id="contacts">
</div>

<%= javascript_tag "ProtoSupport.fetchCustomersContacts('#{customer_contacts_path(@customer)}');" %>
<%= javascript_tag 'ProtoSupport.addAsyncPagination();' %>

Ⅱ.assets/javascript/application.js で、ProtoSupport のこれら 2 つの新しいメソッド:

        fetchCustomersContacts : function(path) {
            $.getScript(path);

        },
        addAsyncPagination : function() {
            $(function() {
                $(".pagination a").on("click", function() {
                    if( $(this).attr('href') == '#' ) return false;
                    $(".pagination").html("Page is loading...");
                    $.getScript(this.href);
                    return false;
                });
            });
        }

リンクは正しくなり (例: 'http://localhost:3000/customers/3/contacts?page=16')、ページをクリックすると、新しいデータが非同期に読み込まれます。

ゴルビー

于 2013-07-01T15:34:30.543 に答える