0

多くのカテゴリを持ち、それに属するテーブル プロジェクトがあります。メイン ページには、すべてのプロジェクトが表示されます。カテゴリごとにクリック イベントがあり、そのカテゴリでプロジェクトをフィルター処理するデータベースが必要です。誰かがこれを達成するためのフレームワークを手伝ってくれますか? 私は、jquery/rails は言うまでもなく、AJAX の完全な初心者です。

ユーザーが複数の投稿をクリックして、両方のカテゴリの投稿をフィードに表示できるソリューションであれば、ボーナス ポイントとなります。

前もって感謝します!

モデル:

class Project < ActiveRecord::Base
  attr_accessible :id, :filename, :location, :uploaded_file, :project_id, :category_id
  has_and_belongs_to_many :categories
  def to_hash
    {
      :id => self.id,
      :filename => self.filename,
      :location => self.location,
    }
  end
end

class Category < ActiveRecord::Base
  attr_accessible :name, :id, :category_id, :project_id
  has_and_belongs_to_many :projects
    def to_hash
    {
      :id => self.id,
      :name => self.name
    }
  end
end


class Category_Project < ActiveRecord::Base
  attr_accessible :project_id, :category_id
  belongs_to :project
  belongs_to :category
  def to_hash
    {
      :project_id => self.project_id
      :category_id => self.category_id
    }
  end
end

私のjQuery onclick関数でのAJAX呼び出し。「猫」は確立されたカテゴリ名の 1 つの名前です。

...
    params = 'category_name=' + cat;
        $.ajax({
            url: "/projects_controller/filter_list",
            data: params
})

私のビューは @projects.each do |project| を実行するだけです。関数。

projects_controller の関連機能:

def filter_list
     @projects = Project.includes(:categories).where("categories.name = ?", params[:category_name])
    respond_to do |format|
      change_color.js /// Is this right?? This is same .js file my onclick event is in.
     end  
end

しかし、テストしてカテゴリ「食品」のタブをクリックすると、何も起こらず、500 内部サーバー エラーが発生します。

4

1 に答える 1

2

これにはいくつかの方法があります。より簡単な方法は、ajax 呼び出しで js スクリプトを返し、それを実行することです。

まず、ajax 呼び出しを次のように変更します。

params = 'category_name=' + cat;
$.ajax({
    url: "/projects_controller/filter_list",
    data: params,
    dataType: 'script'
});

これにより、jQuery は、サーバーから JavaScript ファイルが返されることを期待し、取得したらそれを実行するように指示されます。これを次のように置き換えることができます

$.getScript('/projects_controller/filter_list?category_name=' + cat);

コントローラーの Respond_to ブロックを次のように変更します。

respond_to do |format|
  format.js
end  

filter_list.js.erbここで、views ディレクトリにファイルが必要になります (どこにでも -- views/projects/filter_list.js.erb?)。

プロジェクト/インデックスが次のようになっていると仮定します。

<div class="projects">
<% @projects.each do |project| %>
  <%= render project %>
<% end %>
</div>

新しい js.erb ファイルに次のようなものを入れます。

$('.projects').empty();
<% @projects.each do |project| %>
  $('.projects').append("<%= escape_javascript render(project) %>");
<% end %>

これにより、現在のページのプロジェクト div が、コントローラーからの新しい (フィルター処理された) プロジェクト テンプレートに置き換えられます。

于 2012-10-05T08:03:28.657 に答える