2010-10-21 4 views
0

У меня есть контроллер, который является:Rails 3 - контроллер условный?

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

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

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

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

  • Первая строка @project не является ошибкой.
  • Кроме того, что @log не является ошибкой, а вставляет '' или NIL, что является стандартным рельсом.

Спасибо

+0

Не могли бы вы показать свои отношения в моделях? – Lichtamberg

ответ

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

Я надеюсь, что это помогает!

+0

очень круто. Но я что-то сломал. Просто проверил мои журналы. Я признал, что защищенный метод вызывается. Но когда он идет, чтобы найти проект (find_by_id), он получает идентификатор NULL .... не уверен, что это имеет значение или нет, но поскольку я получаю этот идентификатор из формы, я изменил его на: params [: msg ] [: project_id] – user479959

+0

Только что подтверждено, защищенный вызов не может получить параметры [: msg] [: project_id] он пуст – user479959

+0

А это нормально, так что проблема еще раз ... params [: msg] [: project_id] всегда существуют. так что это снова ломается. hmm – user479959

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

Смежные вопросы