如何使用Simple_form但没有模型显示验证错误消息?

时间:2014-06-07 11:21:50

标签: ruby-on-rails simple-form-for

我在Rails 4应用程序中使用Simple_form。

如何在与模型无关的视图中显示错误消息?

我希望得到与基于模型的其他视图相同的结果。

目前,这是视图中的代码:

<%= simple_form_for(:registration, html: { role: 'form' }, :url => registrations_path) do |f| %>

  <%= f.error_notification %>

  <%= f.input :name, :required => true, :autofocus => true %>
  <%= f.input :email, :required => true %>
  <%= f.input :password, :required => true %>
  <%= f.input :password_confirmation, :required => true %>

  <%= f.button :submit %>

<% end %>

在“普通”视图中(即使用模型),行<%= f.error_notification %>显示错误。

我应该在控制器中做些什么来初始化Simple_form用来显示错误的内容?

由于

3 个答案:

答案 0 :(得分:5)

简单表单不支持此功能&#34;开箱即用&#34;。但你可以添加一个&#34;猴子补丁&#34;在像这样的初始化器(免责声明 - 这似乎适用于我的简单测试用例,但尚未经过彻底测试):

// Put this code in an initializer, perhaps at the top of initializers/simple_form.rb
module SimpleForm
  module Components
    module Errors
      def has_errors?
        has_custom_error? || (object && object.respond_to?(:errors) && errors.present?)
      end

      def errors
        @errors ||= has_custom_error? ? [options[:error]] : (errors_on_attribute + errors_on_association).compact
      end
    end
  end
end

module SimpleForm
  class ErrorNotification
    def has_errors?
      @options[:errors] || (object && object.respond_to?(:errors) && errors.present?)
    end
  end
end

然后您可以像这样在表单中添加错误(请注意,您可以通过设置&#39;错误来指示是否显示错误通知:true&#39;,您必须执行自己的检查以确定是否存在出现错误,并动态添加错误):

=simple_form_for :your_symbol do |f|
  =f.error_notification errors: true
  =f.input :item1, as: :string, error: "This is an error on item1"
  =f.input :item2, as: :string, error: "This is an error on item2"

答案 1 :(得分:0)

simple_form_for助手必须包装模型。但仅仅因为我们说这并不意味着它必须是一个由数据库表支持的ActiveRecord模型。您可以自由创建不受数据库支持的模型。在Rails 3+中,执行此操作的方法是让您的类包含ActiveModel所需的组件。 This SO post通过一个例子解释了如何做到这一点(我确信还有很多其他的)。获得包含ActiveModel::Validation的模型后,您可以添加到errors集合,然后f.error_notification语句将输出您在表支持的模型中习惯的错误。

TL; DR:创建一个非ActiveRecord,非表支持的模型,然后将其视为常规的旧模型,表单应该做正确的事。

答案 2 :(得分:0)

使用client_side_validations gem,它很简单,而且你只能这样做 -

<%= simple_form_for(:registration, html: { role: 'form' }, :url => registrations_path) , :validate => true do |f| %> 

但您还需要在模型中添加验证。