我目前正在关注Ruby on Rails Tutorial by Michael Hartl。并且有一些东西一直困扰着我很长一段时间。我查了一下,但我仍然找不到一个好的答案。
无论如何,我注意到,当您在注册页面中出现验证错误时,它会呈现原始注册页面并更改导航栏地址。我已将 / signup 与新操作相匹配,但如果我使用渲染,则会从 / signup 更改为 / users (默认情况下,因为我认为是RESTful标准)。
我会留下一些代码:
的routes.rb
resources :users
match '/signup', :to => 'users#new'
users_controller.rb
def new
@user = User.new
@title = "Sign up"
end
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to user_path(@user)
else
@title = "Sign up"
@user.password = ""
@user.password_confirmation = ""
render 'new'
end
end
所以我试图通过不使用渲染方法来解决这个问题,而是使用 redirect_to ,但我在使用它时遇到了麻烦。由于它实际上是将数据发送到提供的路径,因此通过创建模型的新实例来覆盖@ user.errors,并且flash变量无法显示错误。
_errors.html.erb
<% if @user.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@user.errors.count, "error") %>
prohibited the user from being saved:
</h2>
<p>There were problems with the following fields:</p>
<ul>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
我的问题是:有没有办法使用渲染我可以更改导航栏上显示的网址?如果有人在注册表单中输入错误,按下导航栏并最终进入一个完全不同的地方,那真是令人沮丧。
答案 0 :(得分:1)
地址更改的原因是您已对 / users / 执行了POST请求,因此浏览器通过显示不同的地址来执行正确的操作。
有几种解决方法:
第一个选项使控制器更加RESTful,但是它需要使用:session或flash来保存重定向中的数据。
第二个选项使代码更简单,但涉及摆弄 routes.rb 文件。
第三个选项依赖于javascript并支持HTML5来破坏用户的浏览器历史记录。
就个人而言,我会保留URL,但如果我有一个坚持这样做的客户,我会选择第二个选项。