Rails 3 - 控制器有条件?

时间:2010-10-21 18:46:31

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

我有一个控制器:

def create
.
.
@project = Project.find(params[:project]

@Log = Logs.create(params[:action]).merge(:project_id => @project.id))
...
end

这里的问题是,有时当DEF创建时,我会有一个项目,我想记录它。其他时候我不会,那也很好,我仍然想创建@Log

Rails处理这个问题的正确方法是什么。我想确定一下:

  • 第一行@project没有错误。
  • 此外@log没有错误,但插入''或NIL无论是rails标准。

谢谢

2 个答案:

答案 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))

我希望这有帮助!