有没有办法避免在使用“渲染”后更改浏览器的地址?

时间:2011-11-15 14:35:06

标签: ruby-on-rails-3

我目前正在关注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 %>

我的问题是:有没有办法使用渲染我可以更改导航栏上显示的网址?如果有人在注册表单中输入错误,按下导航栏并最终进入一个完全不同的地方,那真是令人沮丧。

1 个答案:

答案 0 :(得分:1)

地址更改的原因是您已对 / users / 执行了POST请求,因此浏览器通过显示不同的地址来执行正确的操作。

有几种解决方法:

  1. 存储无效的User对象并重定向回Users.new操作。
  2. 更改Users.create操作的网址。
  3. 使用history.replaceState更改用户的地址栏。
  4. 第一个选项使控制器更加RESTful,但是它需要使用:session或flash来保存重定向中的数据。

    第二个选项使代码更简单,但涉及摆弄 routes.rb 文件。

    第三个选项依赖于javascript并支持HTML5来破坏用户的浏览器历史记录。

    就个人而言,我会保留URL,但如果我有一个坚持这样做的客户,我会选择第二个选项。