我有一个控制器:
def create
.
.
@project = Project.find(params[:project]
@Log = Logs.create(params[:action]).merge(:project_id => @project.id))
...
end
这里的问题是,有时当DEF创建时,我会有一个项目,我想记录它。其他时候我不会,那也很好,我仍然想创建@Log
Rails处理这个问题的正确方法是什么。我想确定一下:
谢谢
答案 0 :(得分:1)
试试这个:
def create
@project = (project_id = params[:project_id]).blank? ? nil :
Project.find(project_id)
@Log = Logs.create(params[:action].merge(@project.nil? ? {} :
{:project_id => @project.id}))
end
如果输入有project_id
,那么如果找不到具有给定id的项目,则上述解决方案将抛出错误。如果您不希望此行为,请使用find_by_id
代替find
。
答案 1 :(得分:0)
在控制器底部附近创建一个受保护的方法,如下所示:
protected
def project_id
# return the cached value if we've already figured it out
return @project_id if defined?(@project_id)
# get the project by id in a failsafe way
project = params[:project_id] ? Project.find_by_id(params[:project_id]) : nil
# return nil if the project is nil, so we don't try to call "id" on it
return @project_id = nil if project.nil?
# cache and return the project id
@project_id = project.id
end
注意我将参数更改为:project_id
而不是project
。这更适合铁轨惯例。现在,在您的create
操作和所有其他操作中,您可以安全地调用它:
@Log = Logs.create(params[:action]).merge(:project_id => project_id))
我希望这有帮助!