Rails 3 - контроллер условный? - PullRequest
0 голосов
/ 21 октября 2010

У меня есть контроллер, который:

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

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

Проблема здесь в том, что иногда, когда DEF CREATE, у меня появляется проект, и я хочу записать это.В других случаях я не буду, и это прекрасно, я все еще хочу создать @ Log

Какой правильный путь в Rails для этого.Я хочу убедиться, что:

  • Первая строка @project не выдает ошибку.
  • Также, что @log не выдает ошибку, но вставляет '' или NIL, что бы это ни былоРельсы стандартные.

Спасибо

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Попробуйте это:

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, то приведенное выше решение выдаст ошибку, если проект с данным идентификатором не найден.Если вы не хотите использовать это поведение, используйте find_by_id вместо find.

0 голосов
/ 21 октября 2010

Создайте защищенный метод в нижней части вашего контроллера следующим образом:

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

Надеюсь, это поможет!

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