我知道这很简单,但我无法解决问题。
这是一个工作板网站。让我们说它的功能与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-如何在预览页面上提交并向我的数据库添加所有信息?
谢谢。
答案 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