Как я уважаю методы RESTful при использовании find_or_initialize_by в Rails 3.2? - PullRequest
1 голос
/ 29 марта 2012

В моем проекте есть ресурс, который собирает некоторую информацию от пользователя.По сути, это форма, которую они заполняют, прежде чем они смогут получить доступ к другой области сайта.Затем он устанавливает файл cookie на неделю, но если они возвращаются, он просматривает свою предыдущую запись и сохраняет свои предпочтения, связанные с ними (и обновляет любые данные, если адрес электронной почты совпадает).У меня есть контроллер Applicants, который выглядит следующим образом:

class ApplicantsController < ApplicationController

  ...

  def create
    @applicant = Applicant.find_or_initialize_by_email(params[:applicant])
    if @applicant.new_record? ? @applicant.save : @applicant.update_attributes(params[:applicant])
      set_cookie_and_redirect
    else
      render 'new'
    end
  end

  def update
    if @applicant.update_attributes(params[:applicant])
      set_cookie_and_redirect
    else
      render 'new'
    end
  end

end

set_cookie_and_redirect - это закрытый метод, который просто устанавливает некоторые файлы cookie и перенаправляет пользователя на страницу.Код работает, но он просто кажется грязным .По сути, это обновление записи в методе create при условии, что это не новая запись.Я также вынужден иметь метод обновления в случае, если существующая запись возвращается с ошибкой проверки - помощник формы затем переключит форму на отправку методу обновления.

Так что, на мой взгляд... есть ли более подходящий способ передать вызов update_attributes в методе create в метод update?Или, проще говоря, есть ли лучший способ уважать методы RESTful в изоляции функциональности создания и обновления?

ОБНОВЛЕНИЕ: Я тоже хотел быть немного более конкретным.Если пользователь заполнил эту форму до того, как он установит файл cookie, ему не нужно будет заполнять ее снова в течение семи дней.Однако через семь дней срок действия файла cookie истек, и они снова видят форму.Контроллер не знает, является ли пользователь новым или существующим, пока не добавит пользовательский ввод в форму, которая затем сравнивается на основе адреса электронной почты.

Заранее спасибо!Я определенно жду чьих-либо мыслей по этому поводу.

1 Ответ

0 голосов
/ 29 марта 2012

Метод create должен только создаваться, а метод update должен только обновляться. Пусть Rails решит, что произойдет, основываясь на том, что находится внутри @applicant при визуализации формы. По сути, он делает то, что вы делаете: проверяет, является ли запись новой или нет, и отправляет ее на update / create соответственно. Пример:

def applicant
  @applicant = Applicant.find_or_initialize_by_email(cookies[:email])
  # renders applicant.html.erb form
end

<%= form_for @applicant do |f| %>
  # ... fields ...
<% end %>

def create
  @applicant = Applicant.new(params[:applicant])
  @applicant.save
  # .. etc.
end

def update
  @applicant = Applicant.find_by_email(cookies[:email])
  @applicant.update_attributes(params[:applicant])
  # ... etc.
end

Rails отправит запрос на правильное действие, основываясь на состоянии new_record? объекта Applicant.

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