【问题标题】:Rails: How to review content before submit/save?Rails:如何在提交/保存之前查看内容?
【发布时间】:2016-12-19 18:33:54
【问题描述】:

我知道这很简单,但我无法找到解决方案。

这是一个求职网站。可以说它的功能类似于this site。当用户填写所有必填信息并单击“到下一步”或“预览”时,另一个页面会加载所有填写的数据。该页面类似于保存数据时的最终页面。

当用户在预览页面时,它可以前进并提交页面(在这种情况下它将被保存到数据库中)。或者,单击返回编辑作业。

我尝试了以下方法::

  • _form.html.erb 内我添加了一个预览按钮 <%= f.submit "Preview", :name => 'preview' %>

  • JobControllers 内我更改了创建方法 def create if params[:preview] @job = Job.new(jobs_params) render 'jobs/preview' else @job.save end end

  • 创建了一个预览视图/jobs/preview.html.erb

现在我有 2 个问题。

1- 在我的预览页面中,我有一个编辑按钮,如下所示:<%= link_to "Edit Job", edit_job_path(@job) %>。但是我有一个错误,因为我找不到@job。错误提示:No route matches {:action=>"edit", :controller=>"jobs", :id=>nil} missing required keys: [:id]

解决方案改成<%= link_to 'Back to edit', 'javascript:history.go(-1);' %>

2- 我如何在预览页面上提交所有信息并将其添加到我的数据库中?

谢谢。

【问题讨论】:

  • 什么不起作用?如果没有特定的代码/错误/等,任何人都很难提供帮助

标签: ruby-on-rails ruby


【解决方案1】:

一旦我完成了类似的任务。我所做的是保存记录,而不是发布。在相关控制器的索引(资源列表)操作中,我只获取published 记录。如果该记录的published 属性设置为true,还显示操作预检查。

我的模型/控制器以前是什么样子的

#model
class Book < ActiveRecord::Base
  ...
  scope :active, -> { where(published: true).some_other_queries }

  self.active?
    (published && some_other_requirements)
  end
  ...
end


#controller
def index
  @books = Book.active
  ...
end

def show
  if @book.active?
    render 'show'
    ...
  else
    ...
  end
end

首先添加了一个用于预览的密钥。

#model
def secret
  #some custom random key generation  
  # e.g. Digest::MD5.hexdigest("#{id}_#{ENV['RAILS_SECRET']}")
end

然后将预览动作添加到控制器

def preview
  # i don't check if the record is active.
  # also added a security layer, to prevent irrelevant guys to view
  # that record
  if @book.secret == params[:secret]
    render 'show'
  else
    ...
  end
end

在仪表板中

...
 = link_to "Preview", preview_book_path(book, secret: book.secret)
...

然后添加了一个成员路由

#routes
resources :books do
  get :preview, on: :member
end

【讨论】:

    【解决方案2】:

    当我必须做这样的事情时,我通常会在我的应用程序中创建一个审核表。该表看起来就像要保存到的表。

    当他们按下“批准”或“保存”按钮时,只需使用正确的数据填充新表。

    我喜欢创建一个路由来处理这个

    resources :something do
      match 'move_to_something_else' => 'somethings#move_to_something_else', as: :move_to_something_else, via: :all
    end
    

    现在我们可以在控制器上执行以下操作:

    def move_to_something_else
      @something = Something.find(params[:id])
      @something_else = SomethingElse.new
      @something_else.name = @something.name
      ....
      @something_else.save
      redirect_to something_else_path(@something_else)
    end
    

    或者,您可以使用默认值“草稿”向表格添加状态

    # config/routes.rb
    resources :something do
      match 'published' => 'somethings#published', as: :published, via: :all
    end
    
    # Controller
    def published
      @something = Something.find(params[:id])
      @something.state = 'published'
      @something.save
      redirect_to something_path(@something)
    end
    

    【讨论】:

    • 为什么要一个单独的表,更容易只有一个名为草稿的列。
    • 也许您想了解更改历史,而不能只使用草稿。它还保持新表的数据更清洁
    • 好吧,我不同意,但我想这就是编程的美妙之处。对于版本历史 IMO,使用像 papertrail 这样的 gem 会更好。
    • 我喜欢papertrail gem。你的解决方案就可以了。它只是我们想要采取的解决问题的方法:),我知道它永远不会只有一种方式,这就是为什么如果我们在同一个项目中,我们会就如何实现这一点进行对话
    • 确实,我喜欢谈论不同的方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多