我正在使用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
答案 0 :(得分:2)
一些关键点:
请勿使用#show
来显示预览。 #show
应该显示正常的持久对象,而你的新对象还没有持久化。您还需要预览中的额外元素,例如“确认”链接/按钮。
最好使用单独的#preview
操作,该操作接受来自#new
的表单提交,并将确认的对象发送到#create
。
你需要一辆车在#preview中传递对象,强制(到#create)和后退(如果不满足则为#new)。虽然我不喜欢使用会话,但似乎没有太多选择。
示例代码:
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。