6

我在我的 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 用来显示错误的东西?

谢谢

4

3 回答 3

5

Simple Form 不支持“开箱即用”的此功能。但是您可以在这样的初始化程序中添加一个“猴子补丁”(免责声明 - 这似乎适用于我的简单测试用例,但尚未经过彻底测试):

// 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

然后你可以像这样向你的表单添加错误(注意你通过设置'errors:true'来指示是否显示错误通知,你必须执行自己的检查以确定是否存在错误,并动态添加错误):

=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"
于 2015-09-15T23:27:44.263 回答
0

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

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

于 2014-06-07T12:02:53.083 回答
-1

使用 client_side_validations gem,它很简单,你只需要做 -

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

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

于 2014-06-07T12:20:02.620 回答