如果Rails控制器中的语句?

时间:2012-03-16 10:29:45

标签: ruby-on-rails ruby-on-rails-3

我可以在控制器中使用if语句,还是这种不好的做法?

在TracksController的创建和销毁操作中,我想做这样的事情:

if Product
@product = Product.find(params[:product_id])
@track = @product.tracks.create(params[:track])

eslif Release
@Release = Release.find(params[:release_id])
@track = @release.tracks.create(params[:track])
end

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我是通过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

因此,通过此设置,可以确保在create和destroy方法中有一个@track实例变量,导致ensure_track在这两个方法之前被调用。

我不确定,如果你应用的逻辑有意义...为什么你要测试一个名为Product的常量是否存在,如果不存在,如果一个名为Release的常量呢?也许问题应该是params[:product_id]params[:release_id]是否存在!?

但这是一个不同的问题:)

更新:有关过滤条件,请参阅Rails Action Controller Guide

答案 1 :(得分:1)

我会更进一步,建议对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,因为我们获得了模型关系的上下文,但我认为有一个更好的术语来描述发布和产品跟踪之间的共性。