繁体   English   中英

在Rails 3.2中使用find_or_initialize_by时如何尊重RESTful方法?

[英]How do I respect RESTful methods when using find_or_initialize_by in Rails 3.2?

我的项目中有一个资源,可以从用户那里收集一些信息。 基本上,这是他们在访问网站的其他区域之前填写的表格。 然后,它会设置一个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方法内的记录不是新记录的情况下更新记录。 万一现有记录返回验证错误,我还必须拥有一种更新方法-表单帮助器随后会将表单切换为发送到更新方法。

因此,我要说的是……是否有更合适的方法将create方法中的update_attributes调用推送到update方法? 或更恰当地说,在隔离创建和更新功能时是否有更好的方法来尊重RESTful方法?

更新:我也想更具体一些。 如果用户在填写此表单之前先设置了Cookie,那么他们就不必在7天之内再次填写该cookie。 但是,在7天后,cookie过期了,他们再次看到了该表格。 直到用户将用户输入添加到表单中,然后根据电子邮件地址进行比较,控制器才知道用户是新用户还是现有用户。

提前致谢! 我绝对期待任何人对此的想法。

create方法应仅创建,而update方法应仅更新。 让Rails根据呈现表单时@applicant内部的@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?将请求发送到正确的操作new_record? 申请人对象的状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM