Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 3.2中使用find_或_initialize_by时,我如何尊重RESTful方法?_Ruby On Rails_Ruby_Ruby On Rails 3_Rest_Activerecord - Fatal编程技术网

Ruby on rails 在Rails 3.2中使用find_或_initialize_by时,我如何尊重RESTful方法?

Ruby on rails 在Rails 3.2中使用find_或_initialize_by时,我如何尊重RESTful方法?,ruby-on-rails,ruby,ruby-on-rails-3,rest,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Rest,Activerecord,我的项目中有一个资源,可以从用户那里收集一些信息。基本上,这是他们在进入网站的另一个区域之前填写的表格。然后,它会设置一周的cookie,但如果他们回来,它会查找他们以前的条目,并将他们的首选项与之绑定(只要电子邮件地址匹配,就会更新任何详细信息) 目前,我有一个如下所示的申请者控制器: class ApplicantsController < ApplicationController ... def create @applicant = Applicant.fin

我的项目中有一个资源,可以从用户那里收集一些信息。基本上,这是他们在进入网站的另一个区域之前填写的表格。然后,它会设置一周的cookie,但如果他们回来,它会查找他们以前的条目,并将他们的首选项与之绑定(只要电子邮件地址匹配,就会更新任何详细信息)

目前,我有一个如下所示的申请者控制器:

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_和_redirect是一个私有方法,它只设置一些cookie并将用户重定向到页面。代码可以工作,但是感觉脏了。它本质上是在create方法中更新一条记录,前提是它不是新记录。我还必须有一个更新方法,以防现有记录返回时出现验证错误——表单助手随后将表单切换为发送到更新方法

所以就我而言。。。是否有更合适的方法将create方法中的update\u attributes调用推送到update方法?或者更好地说,在隔离创建和更新功能时,有没有更好的方法来尊重RESTful方法

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


提前谢谢!我非常期待任何人对此发表看法。

创建
方法应该只创建,更新方法应该只更新。当表单呈现时,让Rails根据
@applicator
的内部内容决定将要发生什么-它基本上执行您正在执行的操作:检查记录是否为新记录,并相应地将其发送到
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
def申请人
@申请人=申请人。通过电子邮件查找或初始化(cookies[:电子邮件])
#呈现applicator.html.erb表单
终止
# ... 领域。。。
def创建
@申请人=申请人。新建(参数[:申请人])
@申请人。保存
# .. 等
终止
def更新
@申请人=申请人。通过电子邮件查找(cookies[:电子邮件])
@申请人。更新_属性(参数[:申请人])
# ... 等
终止

Rails将根据申请人对象的
新记录?
状态将请求发送到正确的操作。

嘿,bricker,我想我看到了您在这里所做的事情,但我不确定申请人方法何时执行。这就是新方法吗?问题是,在表单中添加某些内容之前,管理员不知道自己是新的还是现有的申请人。这些信息不是来自cookie,而是来自用户输入。Bricker,我在想。。。也许您知道在控制器中转发到不同操作的方法吗?我总是可以创建一个自定义操作,我们称之为“check”,表单将发布到“check”。check方法可以确定它是否是新的(请记住,我必须检查数据库,因此必须进行确定,因为我通过了对用户输入的检查,form_for不知道这些细节)。那么,是否有可能让check方法转发以进行创建或更新?