如何向资源添加`preview`动作?

时间:2013-02-13 12:09:15

标签: ruby-on-rails ruby-on-rails-3 rest routes

我正在寻找在previewnew行动之间加入create行动的正确方法。 我们假设我有以下内容:

resources :users

默认情况下,提交表单时:

  • 如果new,请致电create行动;
  • 如果edit,请致电update

通过这种方式,我可以对newcreate使用相同的格式(部分),这很棒!

如何配置资源以在操作之间包含preview。我的意思是,强迫new拨打preview,然后preview拨打create

我可以添加新的路线/操作并指明该操作的表单,但同一表单不能用于newedit

有一种方法可以配置资源吗?

3 个答案:

答案 0 :(得分:1)

看看这个railscast:multibutton form,它会显示一个包含“预览”和“提交”按钮的表单,也许这是您可能想要做的事情。

顺便说一句,你不能通过将locals传递给partial来使用相同的表单吗?例如:

<%= form_for @profile, url: dynamic_path do |f| %>
  ...
<% end %>

<%= render 'form', dynamic_path: profile_preview_path %>

答案 1 :(得分:0)

你有几种方法可以做到这一点:

  1. 您将表单的网址更改为preview操作(您必须为其添加路线)。
  2. 您使用创建操作进行预览并创建:
    即你在表单提交请求中添加一个参数(如':go_to_preview')。如果您在控制器中找到它,则会呈现preview 当用户想要确认预览时,再次提交数据(没有该参数),这次创建记录。
  3. 还有两种动态可能性:

    1. 您实时创建预览 - 如果可能的话(如此处所示) - 并仅使用create操作,
    2. 第一个选项的变体:当用户提交表单时,您将 ajax发布请求发送到preview操作,呈现部分和将它包含在页面上,然后当您的用户仍然拥有他刚刚填写的表单时,用户会决定是否要修改或提交。

答案 2 :(得分:-2)

我建议添加一个DateTime列“finished_at”,“published_on”等等......适用于您的域名。

以博客文章为例:

scope :published, where("published_on IS NOT NULL")
scope :draft, where(:published_on => nil)

使用适当的范围和新字段来限制后续操作。

这种方法比你要求的更多:

  1. 基于“状态”限制处理的方法
  2. 创建时间与发布时间的数据