Rails:如何在提交/保存之前查看内容?

时间:2016-12-19 18:33:54

标签: ruby-on-rails ruby

我知道这很简单,但我无法解决问题。

这是一个工作板网站。让我们说它的功能与this site类似。当用户填写所有必填信息并点击" 下一步"或" 预览",另一个页面加载所有填充的数据。该页面与保存数据时的最终页面类似。

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

我尝试了以下::

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

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

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

现在我有两个问题。

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-如何在预览页面上提交并向我的数据库添加所有信息?

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

我想创建一个路由来处理这个

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

另外,您可以使用默认值“draft”

向表中添加状态
# 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

答案 1 :(得分:0)

一旦我完成了类似的任务。我所做的是保存记录,但不发布。在相关控制器的索引(资源列表)操作中,我只获取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