0

我正在使用 Ruby on Rails 开发一个小项目,基本上学生可以注册一个自习室。我有一个我正在尝试进行的修改,但我还无法弄清楚。

默认情况下,当我创建新提交时,它会创建它并进入基本上显示来自提交的所有信息的视图屏幕。这是表单的控制器:

# POST /students
# POST /students.json
def create
@student = Student.new(params[:student])

respond_to do |format|
  if @student.save
    format.html { redirect_to @student, notice: 'Student was successfully created.' }
    format.json { render json: @student, status: :created, location: @student }
  else
    format.html { render action: "new" }
    format.json { render json: @student.errors, status: :unprocessable_entity }
  end
end
end

我想要做的是,当用户单击提交按钮时,它不会自动将其保存到数据库中,而是进入下一个屏幕,用户可以在其中查看提交并通过单击按钮确认提交。一旦他们单击确认按钮,它应该将其保存到数据库并显示“学生已成功创建”。注意并将它们带回表单屏幕。

这是节目的控制器(这是显示的下一页):

# GET /students/1
# GET /students/1.json
def show
@student = Student.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @student }
end
end
4

1 回答 1

2

一些关键点:

  1. 不用于#show显示预览。#show应该显示正常的持久对象,而您的新对象尚未持久。您还需要额外的预览元素,例如“确认”链接/按钮。

  2. 最好使用单独的#preview操作,它接受来自 的表单提交#new,并将确认的对象发送到#create

  3. 您需要车辆在#preview 中传递对象,强制(到#create)和返回(如果不满意,则返回#new)。虽然我不喜欢使用 session,但似乎没有太多选择。

示例代码:

def new
  @student = session[:student].blank? ? Student.new : session[:student]
  # ...
  render
end

def preview
  @student = Student.new(params[:student])
  session[:student] = @student
  # ....
  render
end

 def create
   @student = session[:student]
   session[:student].clear
   # ...
   render
 end

添加

更多关于#3。在#create 中,您需要参数来构建一个包含完整数据的新对象以保存。但是在这种情况下,表单不会提交给#create,而是提交给#preview。那么如何获取数据呢?有以下三种方式:

一个。普通显示(就像#show)。在#preview 中,构建一个带有隐藏字段的表单,其中填充了#new 发送的数据。

湾。朴素的展示。使用会话而不是表单来传递数据。比#a 简单得多。

C。在#preview 中显示纯文本和表单。用户可以预览提交并在#preview 中对其进行编辑。

根据您的需要,#b 和 #c 都是很好的 IMO。

于 2013-06-05T18:48:47.927 回答