Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如果保存后重定向不是保存的对象,则验证失败_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails 如果保存后重定向不是保存的对象,则验证失败

Ruby on rails 如果保存后重定向不是保存的对象,则验证失败,ruby-on-rails,validation,Ruby On Rails,Validation,我试图这样做,当一个用户注册时(即:创建了一个新用户),它会将他们重定向到教程。但是,当用户注册时,它会给出一条错误消息,说明用户名和电子邮件必须是唯一的(即使是唯一的),并再次呈现“新”页面 如果我改为重定向到@user,效果很好 这是我的控制器: def create @user = User.new(params[:user]) respond_to do |format| if @user.save login(@user)

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

如果我改为重定向到
@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

当我看到这一点时,我非常害怕

validates_presence_of :plain_password, :on => :create
您是否正在数据库中保存未加密的密码

关于您的问题,您可以考虑使用<代码>响应d> <代码> >代码>响应>

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
class UsersController

读了这篇博文

我发现了——部分原因

我需要在我的路线文件中将路线添加到教程中:

match "tutorial" => "static#tutorial"
然后重定向到它,而不是字符串:

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

这背后的理论可能有一个完整的解释,但我将留给其他人来回答。我就是这样解决的。

您应该考虑重构代码。您没有理由像现在这样需要在
respond\u to
块中执行条件逻辑。@zeantsoi这是rails生成器生成的代码,当您考虑它时,它是非常合理的。没有理由不把条件逻辑放在
respond_to
块中。哈哈,没有。。plain_password是一个attr_访问器,然后将其加密到数据库中名为password的字段中。在数据库中它真的应该被称为hashd_password,但我已经称它为password,所以我没有费心修改它。谢谢你的关心!!是的,您需要在路由文件中定义应用程序的每个可访问路径。我建议使用
get
语法。阅读本节,
static
controller中的所有页面都可用于get请求,使用
match'static/:action',:controller=>“static”