首页 > 解决方案 > Rails 部分验证取决于控制器

问题描述

我正在使用设计进行用户注册,这意味着默认情况下,新用户是通过 registrations_controller 注册的。因此,通过单击“注册”按钮,用户将被重定向到new_user_registration path.

然而,我的注册表有两个步骤。在第一步(new_user_registration)中,我要求输入名称和密码。在第二步(users_controller)中,当用户被保存时,我要求地址。这是我用向导 gem 做的:

    def create
    @user = User.new(params[:user])
    if @user.save
      session[:user_id] = @user.id
      redirect_to user_steps_path
    else
      render :new
    end
  end

因此,这些是一种部分验证,但我无法根据步骤进行验证,因为我的表单的第一部分是通过注册控制器处理的。然而,第二部分在 users_controller 中。这里变得越来越复杂,我想知道是否可以根据控制器进行验证。喜欢:

validates :first_name, presence: true, if: -> { new_user_registration_path }
validates :last_name, presence: true, if: -> { new_user_registration_path }
validates :street, presence: true, if: -> { new_user_path }

我知道,像这样,毫无意义,但也许有助于理解我背后的想法。另外,也许我可以和 smth 一起工作。喜欢:

validates :first_name, presence: true, if: -> { @user.save }
validates :last_name, presence: true, if: -> { @user.save }
validates :street, presence: true, if: -> { @user.update}

所以基本上,在创建新用户时,我会验证名称和密码是否存在。然后添加地址(这是用户的更新操作)时,我将检查地址是否存在。有没有人有过这样的表格的经验?

另一个想法,也许,我可以跳过注册控制器,直接重定向到用户并为部分验证创建两个步骤?但是当我正在使用设计时,我不知道是否可以通过用户控制器,跳过 new_user_registration 路径。我做到了,它是如何在 wicked tutorial 上得到建议的,但最终还是出现在注册控制器中:

 def create
      super
  end
 def update
      super
  end

谢谢!

标签: ruby-on-railsdevisewicked-gem

解决方案


此类问题的最佳解决方案是使用表单对象。请参阅此示例gem 改革

使用表单对象,每个 HTML 表单都通过一个表单对象进行处理。在您的示例中,您可以有一个“用户注册”表单和一个“用户更新”表单。关键是验证是由表单而不是模型完成的。这样,验证与当前表单输入相关,并且您避免了对验证规则进行分类的问题。


推荐阅读