我的多步骤表单中的创建操作存在一些问题。当我提交付款表单时,我在最后一页收到错误(渲染重定向不能被调用两次)
当@post.all_valid?
为真时,如何让我的创建操作与渲染新建和重定向一起工作?
我的控制器操作如下所示:
def create
session[:post_params].deep_merge!(params[:post]) if params[:post]
@post = Post.new(session[:post_params])
@post.current_step = session[:post_step]
if @post.valid?
if params[:back_button]
@post.previous_step
elsif @post.last_step?
if @post.all_valid?
@post.save_with_payment
flash[:notice] = 'Your post was created successfully'
redirect_to @post
end
else
@post.next_step
end
session[:post_step] = @post.current_step
end
if @post.new_record?
render "new"
else
session[:post_step] = session[:post_params] = nil
end
end
答案 0 :(得分:2)
如果您使用多个render
来电或redirect_to
和render
的组合,则需要指定return
以及除最后一个之外的所有内容那些电话。一般来说,我甚至在最后一次通话中使用return
也只是为了明确。原因是因为redirect_to
或return
都没有停止执行,因此你看到了你所看到的错误。
尝试一下:
def create
session[:post_params].deep_merge!(params[:post]) if params[:post]
@post = Post.new(session[:post_params])
@post.current_step = session[:post_step]
if @post.valid?
if params[:back_button]
@post.previous_step
elsif @post.last_step?
if @post.all_valid?
@post.save_with_payment
flash[:notice] = 'Your post was created successfully'
redirect_to @post and return
end
else
@post.next_step
end
session[:post_step] = @post.current_step
end
if @post.new_record?
return render "new"
else
session[:post_step] = session[:post_params] = nil
end
end
同样,您的代码与上述代码之间的区别在于and return
和redirect_to
之后的render
。
另一种方法是说return redirect_to ...
或return render ...
,但我更喜欢上述内容,因为它更具“可读性”。
答案 1 :(得分:1)
在第一次出现后添加“并返回”