используя: область действия, чтобы показать результаты без добавления нового действия - PullRequest
1 голос
/ 27 октября 2011

Я собираюсь использовать: scope в моем приложении rails 3.1 и мне нужно немного указаний о том, как правильно их реализовать.Я понимаю, что вы пишете логику в модели (чтобы извлечь нужные данные), но мой вопрос касается следующих шагов.

Например: у меня есть «кусок» информации.У каждой «Части» есть Тема и Аудитория среди прочего.Я хотел бы использовать области для отображения всех «частей» информации для данной темы или аудитории без записи новых действий в моем контроллере.

По сути, я не уверен, как связать эти представления без создания новых действий в контроллере, а затем просто с помощью типичного link_to.Я хотел бы использовать области, которые я написал.

Я ищу правильный (и наиболее подходящий) способ сделать это.

Заранее благодарен за любую помощь вэто.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Тебе даже не нужен простор для этого.Проверьте это:

Piece.includes([:topic, :audience]).where(['`topics`.name = ?', 'Politics'])

С Rails 3 & Arel большинство областей совершенно не нужны.

При использовании этого в представлениях без создания новых действий контроллера вы можете настроить некоторые условия с помощью параметровпередается в действие индекса, чтобы определить, как выполнить запрос.


Например: (и это пример грубый , непроверенный , но это должен работать)

app / controllers /iece_controller.rb:

class PieceController < ApplicationController

  def index
    case params[:find_by]
      when 'topic_name'
        @pieces = Piece.includes([:topic, :audience]).where(['`topics`.name = ?', params[:topic_name])
      when 'topic_id'
        @pieces = Piece.includes([:topic, :audience]).where(['`topics`.id = ?', params[:topic_id])
      else
        @pieces = Piece.all
    end

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @addressees }
    end
  end

  # ...
end

app / views /iece / index.html.erb:

<%= link_to 'Politics Pieces', :controller => 'pieces', :find_by => 'topic_name', :topic_name => 'Politics' %>

Другой пример использования поля выбора и JavaScript:

app / views / piece / index.html.erb:

<%= select 'find_by', 'topic', find_by_topic_select_options %>

app / helpers / parts_helper.rb: (перемещена ссылка здесь для удобства чтения)

module PieceHelper
  def find_by_topic_select_options
    Topic.all.collect do |topic|
      url = url_for :controller => 'pieces', :find_by => 'topic_id', :topic_id => topic.id
      [topic.name, url]
    end
  end
end

public / javascripts / application.js:

window.onload = (function (ev) {
  var find_by_topic_select = document.getElementById('find_by_topic');
  find_by_topic_select.onchange = (function (e) {
    var selected = this.options[this.selectedIndex];
    window.location = selected.value;
  });
});

И, сноска, вы не link_to ассоциация или структура данных.Вы ссылаетесь на URL или маршрут, который вызывает действие (которое отображает представление), которое соответствующим образом отображает вашу структуру данных.Я надеюсь, что это прояснит для вас.

0 голосов
/ 27 октября 2011

Вот как бы я это сделал:

В piece.rb

def self.scope_by_topic(topic_name)
  topic_name.present? ? includes(:topic).where(topic: {name: topic_name}) : self.scoped
end

def self.scope_by_audience(audience_name)
  topic_name.present? ? includes(:audience).where(audience: {name: audience_name}) : self.scoped
end

О методе scoped, который я использую здесь: http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped

В тебе pieces_controller.rb:

def index
  @pieces = Piece.scope_by_topic(params[:topic_scope])
                 .scope_by_audience(params[:audience_scope]).all
  # render view here
end

И, на ваш взгляд, вы можете использовать следующий помощник:

link_to "My piece of information", pieces_path(topic_scope: 'A topic', audience_scope: 'An audience')

URL будет выглядеть так:

http://www.example.com/pieces?topic_scope=A+topic&aucience_scope=An+audience

...