如果保存后重定向是保存对象以外的任何位置,则验证失败

时间:2013-06-28 06:20:19

标签: ruby-on-rails validation

我试图让它成为当用户注册时(即:创建一个新用户),它会将它们重定向到教程。但是,当用户注册时,它会显示一条错误消息,指出用户名和电子邮件必须是唯一的(即使它们是)并再次呈现“新”页面。

如果我重定向到@user,这可以正常工作。

这是我的控制者:

  def create
    @user = User.new(params[:user])
    respond_to do |format|
       if @user.save
         login(@user)
         format.html { redirect_to "static/tutorial", success: 'Congratulations on starting your journey!' }
         format.json { render json: @user, status: :created, location: @user }
       else
         format.html { render action: "new" }
         format.json { render json: @user.errors, status: :unprocessable_entity }
       end
     end
  end

这些是User.rb中的相关行:

validates_confirmation_of :plain_password
validates_presence_of :name, :username, :email
validates_presence_of :plain_password, :on => :create
validates_uniqueness_of :email, :username

2 个答案:

答案 0 :(得分:0)

当我看到我很害怕时

validates_presence_of :plain_password, :on => :create

您是否在数据库中保存了未加密的密码?

关于您的问题,您可以考虑使用respond_to / respond_with

class UsersController < ApplicationController
  respond_to :html, :json

  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      # set sessions
    end

    respond_with @user, location: 'static/tutorial'
  end
end

阅读此博客文章http://bendyworks.com/geekville/tutorials/2012/6/respond-with-an-explanation

答案 1 :(得分:0)

我想出来了 - 部分。

我需要在路线文件中添加一个指向教程的路径:

match "tutorial" => "static#tutorial"

然后重定向到该而不是字符串:

format.html { redirect_to tutorial_path, success: 'Congratulations on starting your journey!' }

这背后的理论可能有一个完整的解释,但我会留给别人回答。这就是我解决它的方法。