【问题标题】:How do I validates input while using Ransack?使用 Ransack 时如何验证输入?
【发布时间】:2021-12-29 15:54:47
【问题描述】:

我使用 Ransack 创建了一个包含多个搜索栏的搜索表单,并意识到即使模型中有 validates 代码,我仍然会得到搜索结果,而某些输入栏为空白。

ticket.rb

class Ticket < ApplicationRecord
  validates :departure, presence: true
  validates :arrival, presence: true 
  validates :departure_date, presence: true
  
end

有人知道在使用 Ransack 时如何验证正确的方法吗?

【问题讨论】:

  • 你的问题我不清楚。 Ransack 是一种搜索(读取)现有记录的工具,但验证用于在创建或更新时验证记录。我不明白您是如何验证搜索查询的?
  • 您需要设置某种服务对象来处理此过程,您可以验证搜索条件,然后如果有效则执行搜索。不幸的是,就目前而言,这个问题对我来说太模糊了,无法提供超出这个基本方向的任何帮助。
  • @engineersmnky 感谢您的回复。由于 Ransack 允许您将部分搜索输入留空,并且仍然向您显示搜索结果,因此我想确保所有字段都已填写,否则会出现错误消息。

标签: ruby-on-rails ruby validation ransack


【解决方案1】:

您会理解复杂的验证流程。您的模型在验证后收到错误,您的控制器回退到 post 操作以呈现编辑表单和表单字段显示错误。简短的例子:

app/controllers/companies_controller.rb:

class CompanyController < ApplicationController
  def index
    @search = CompanySearchForm.new(name: company_search_params[:name])
    @search.validate
    @companies = Company.ransack(name_eq: company_search_params[:name]).result
  end

  ...
  private

  def company_search_params
    params.require(:company_search_form).permit(:name)
  end

  def search_form
    form = ::CompanySearchForm.new(name: company_search_params[:name])
    form.validate
    form
  end
end

app/forms/copmany_search_form.rb

class CompanySearchForm
  extend ActiveModel::Naming
  extend ActiveModel::Translation
  include ActiveModel::Validations
  include ActiveModel::Conversion
  include ActiveModel::Validations::Callbacks
  include ActiveRecord::AttributeAssignment

  attr_reader :name

  def initialize(name:)
    @name = name
  end

  def validate
    errors.add(:name, 'search string is too long.') if name.size > 5
  end
end

app/views/companies/index.html.haml

= simple_form_for(@search, url: companies_path, method: :get) do |f|
  = f.input :name

  = submit_tag('Search', class: 'btn')

%table
  = @companies.each do |company|
    %tr
      %td= company.id
      %td= company.name

关于工作示例请转到here

【讨论】:

  • OP 似乎指的是未持久的搜索对象而不是 ActiveRecord 对象,所以我不确定这是否能回答这种情况下的问题。另外create 会失败,因为@companynil
  • 已编辑。谢谢!
  • 附加注释:现在valid? 如果对象无效则返回true,因为如果没有错误则返回 false (errors.blank?)。将if 更改为unless 或将blank? 更改为any?
  • @engineersmnky 感谢您的提示!
  • 是的。我也很尊重。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多