0

有一个用户提交的表单,然后由模型验证。我只希望“省/州”字段验证“国家”是“CA”(加拿大)还是“US”(美国)

表单的设置略有不同,因为我们正在从流程中执行多个步骤。

这里是控制器。

    def update
        case step
        when :step1
          wizard_params = profile_params()
          wizard_params[:wizard] = 'step1'

          @profile = current_user.profile
          @profile.update(wizard_params)

          render_wizard @profile
end

    private
        def profile_params
          # There are more params although I stripped them for the simplicity of this example
          params.require(:profile).permit(:state_id, :country)
        end

简介.rb

  belongs_to :state, :class_name => "ProvinceState", :foreign_key => :state_id, optional: true

我硬编码optional: true,但如果用户选择 CA/US 或保存的字段是 CA/US,我只想要可选:true。

我看了一下 lambda,它可能是我需要的东西。

例如:

belongs_to :state, :class_name => "ProvinceState", :foreign_key => :state_id, optional: lambda | obj | self.country == CA || self.country == US ? true : false 
4

2 回答 2

1

不幸的是,您不能(当前)提供 lambda 来optional查看源代码

required = !reflection.options[:optional]

如果需要,Rails 只需添加一个存在验证,如下所示:

model.validates_presence_of reflection.name, message: :required

因此,作为一种解决方法,您可以分两部分执行此操作:首先将关联指定为optional;然后明确地使其符合您的条件:

belongs_to :state, :class_name => "ProvinceState", :foreign_key => :state_id, optional: true
validates :state_id, presence: true, if: ->{ %w[CA US].include?(country) }

如果逻辑变得更加复杂,您可能希望将其移至单独的方法/类而不是内联 lambda。请参阅:执行自定义验证

于 2019-12-23T15:44:52.950 回答
0

您可以使用 lambda 条件进行验证,如下所示:

validates :state, presence: true, if: -> { %w[US CA].include?(country) }
于 2019-12-23T15:45:06.403 回答