我可以在控制器中使用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
有更好的方法吗?
答案 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,因为我们获得了模型关系的上下文,但我认为有一个更好的术语来描述发布和产品跟踪之间的共性。