目前,我有两个使用users#create
操作的观点:users/new.thml.erb
和enter_email.html.erb
。
问题在于,使用当前代码时,用户会被重定向到new.html.erb
enter_email.html.erb
中的表单有验证错误。所以我尝试了这个:
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
if params[:action] == "enter_email"
render 'enter_email'
else
render 'new'
end
end
end
我希望用户在操作'enter_email'时被重定向到enter_email.html.erb
。但我仍然被重定向到'new.html.erb'。
有任何解决此问题的建议吗? (这是因为正在执行的操作实际上是create
?如果是,如何修改代码以使重定向工作?)
答案 0 :(得分:3)
我看到了几种方法:
在两个表单中添加隐藏字段,并在params
中查看该字段的值,以便了解您来自哪个表单
# in your new.html.erb view
hidden_field_tag 'form_name', 'new'
# in your enter_email.html.erb view
hidden_field_tag'form_name','enter_email'
# in controller
if params[:form_name] == "enter_email"
render 'enter_email'
else
render 'new'
end
使用其他操作进行创建,例如create_from_enter_email
,并将enter_email
表单指向它。
答案 1 :(得分:2)
正如您所想,问题是操作是create
而不是enter_email
,因此if / else条件总是转到else分支并呈现new
视图。
要呈现上一个视图,您可以按this answer中的建议使用request.referrer
:
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
if request.referrer == root_url
render 'enter_email'
else
render 'new'
end
end
end
我正在检查request.referrer
是root_url
是否基于登录部分在主页上的事实(您在下面的评论中提到)。这应该有用。