Если оператор в Rails Controller? - PullRequest
1 голос
/ 16 марта 2012

Могу ли я использовать оператор if в моем контроллере или это плохая практика?

В моих действиях создания и уничтожения для TracksController я хочу сделать что-то вроде этого:* Есть ли лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Я бы сделал это с помощью before_filter обратного вызова:

class TracksController < AC
  before_filter :ensure_track, :only => [ :create, :destroy ]

  private

  def ensure_track
    if Product
      @product = Product.find(params[:product_id])
      @track = @product.tracks.create(params[:track])
    elsif Release
      @release = Release.find(params[:release_id])
      @track = @release.tracks.create(params[:track])
    end
  end
end

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

Я не уверен, хотя, если логика, которую вы применяете, имеет смысл ... Почему вы хотите проверить, существует ли константа с именем Product, и если нет, есликонстанта с именем Release делает?Может быть, вопрос в том, присутствует ли params[:product_id] или params[:release_id]!?

Но это другой вопрос:)

ОБНОВЛЕНИЕ: См. Руководство по контроллеру действий Rails для фильтров.

1 голос
/ 18 марта 2012

Я бы пошел дальше и предложил более СУХОЙ подход к before_filter:

class TracksController < ApplicationController
  before_filter :get_track_parent, only: [ :create, :destroy ]

  def create
    @track = @parent.tracks.create(params[:track])
    ...
    redirect_to @parent
  end

  private

  def get_track_parent
    if params[:product_id].present?
      @parent = Product.find(params[:product_id])
    elsif params[:release_id].present?
      @parent = Release.find(params[:release_id])
    end
  end
end

Я использовал parent, потому что нам дали контекст для отношений модели, но я предполагаю, что есть лучший термин для описания сходства между выпуском и следами продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...