需要表单提交帮助

时间:2013-06-05 17:54:25

标签: ruby-on-rails

我正在使用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

1 个答案:

答案 0 :(得分:2)

一些关键点:

  1. 请勿使用#show来显示预览。 #show应该显示正常的持久对象,而你的新对象还没有持久化。您还需要预览中的额外元素,例如“确认”链接/按钮。

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

  3. 你需要一辆车在#preview中传递对象,强制(到#create)和后退(如果不满足则为#new)。虽然我不喜欢使用会话,但似乎没有太多选择。

  4. 示例代码:

    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中,你需要使用params来构建一个具有完整数据的新对象来保存。但是在这种情况下,表单不会提交给#create而是#preview。那么你如何获得数据?有三种方式:

    一个。普通显示(就像#show一样)。在#preview中,构建一个包含隐藏字段的表单,其中填充了#new。

    发送的数据

    湾平原显示。使用session传递数据而不是表单。比#a简单得多。

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

    根据您的需要,#b和#c都是不错的IMO。