如果我在某个路由别名上,例如/ register,我有一个表单错误而且我渲染:new,路径是否可以/注册?
目前正在渲染/新
我可以执行redirect_to register_path但是我会丢失params吗?
它使以下测试失败:
Scenario: Try registering with a bad staff number
Given I am on the registration page
When I fill in "email" with "kevin@acme.com"
And I fill in "First Name" with "Kevin"
And I fill in "last name" with "Monk"
And I fill in "Employee Number" with "something barking123"
And I press "Register"
Then I should be on the registration page
And I should see "Your employee ID number looks incorrect."
答案 0 :(得分:1)
Rails方法是再次呈现“新”(即寄存器)操作,因为您已经创建了对象,该表单将包含先前输入的值以及错误消息。如果重定向,则必须在执行重定向之前将对象保存在会话或数据库中。如果偏离惯例,那么确保你这样做是有好处的。
答案 1 :(得分:1)
从动作调用渲染将意味着URL将保持不变,无论是GET还是POST。 URL为/ new的原因是因为'Register'必须POST到/ new。如果您希望此功能通过,您应该将“然后我应该在注册页面上”更改为“然后我应该在新注册页面上”并在我看来写下相应的网页步骤。
答案 2 :(得分:1)
另一种方法是设置两个“注册”路由。一个只接受GET请求(并转到:新动作)而另一个只接受POST请求(并转到create动作,但呈现与new相同的模板)。
这可能如下所示:
map.get_register 'register', :controller => :registrations,
:action => :new, :conditions => { :method => :get }
map.post_register 'register', :controller => :registrations,
:action => :create, :conditions => { :method => :post }
然后在你的控制器中:
def new
@registration = Registration.new
# renders the 'registrations/new' template
end
def create
@registration = Registration.new(params[:registration])
# render the 'registrations/new' template if we fail validation
return render(:action => :new) unless @registration.save
# otherwise renders the "create" template which is likely a thank-you
end
在这个问题上似乎还有更多相似之处: Use custom route upon model validation failure
答案 3 :(得分:0)
如果您真的想要这个,那么您可以将“创建”操作合并到“新”操作中,并将“更新”操作合并到“编辑”操作中。然后,您需要检查请求类型并相应地处理它。
这将实现您的要求。此外,人们将能够使用“错误”URL并仍然转到有效页面。也就是说,即使在收到错误后,他们也可以复制/粘贴网址,并且会有一个有效的GET页面。
话虽这么说,这是一个重大的黑客,而不是我建议你做的事情。你需要做大量的工作,而且上升空间很小。
编辑:示例..
def new
if request.get?
@user = User.new
elsif request.post?
@user = User.new(params[:user])
if @user.save
redirect_to users_path
else
render :new
end
end
end
您还需要添加自定义路线。
答案 4 :(得分:0)
实际上,这看起来像测试中的一行修复。 (为什么你更喜欢在/注册页面?)。
如果真的很重要,你也可以暂时在会话变量中存储params。