【问题标题】:Rails partial validations depending on conrtollerRails 部分验证取决于控制器
【发布时间】:2020-01-21 11:08:09
【问题描述】:

我正在使用设计进行用户注册,这意味着默认情况下,新用户是通过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 教程中得到建议的,但最终还是出现在注册控制器中:

 def create
      super
  end
 def update
      super
  end

谢谢!

【问题讨论】:

    标签: ruby-on-rails devise wicked-gem


    【解决方案1】:

    此类问题的最佳解决方案是使用表单对象。请参阅this example 和gem Reform。

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

    【讨论】:

    • 谢谢。这实际上是否意味着,我需要“地址模型”,这基本上是我在表单中的第二步?
    • 视情况而定。如果用户可以拥有多个地址,那么是的,您需要一个地址模型。如果用户只有一个地址,您可以在用户模型中使用地址属性。如果有很多地址特定的代码,那么有一个单独的地址对象也是有意义的。
    • 我找到了一个更简单的解决方案,也许你会感兴趣:见下文
    【解决方案2】:

    就这么简单:

    validates :first_name, presence: true, :on => :create
    validates :last_name, presence: true, :on => :create
    validates :street, presence: true, :on => :update
    validates :house_number, presence: true, :on => :update
    validates :city, presence: true, :on => :update
    validates :zip_code, presence: true, :on => :update
    

    显然“注册”会创建一个用户。而wizard_steps 只是更新用户。因此,对于这个简单的示例,这可以完美运行,并根据控制器操作引发验证错误。

    【讨论】:

    • 这不是一个很好的解决方案。它将模型与输入序列联系起来,并意味着在后续操作中跳过某些属性的验证(例如,如果用户想稍后更新他们的名字)。表单对象是一种更加灵活和可扩展的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2011-08-22
    • 2019-04-28
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多