【问题标题】:Rails display current controller errorsRails 显示当前控制器错误
【发布时间】:2015-04-10 03:08:05
【问题描述】:

问题其实很简单。我想在我的应用程序中的每个控制器的 simple_form_for 标签之外显示错误通知。

我使用以下代码:

- if @user.errors.present?
  .alert-box.alert{ data: { alert: true } }
    %div= t('simple_form.error_notification.default_message')

这可以,但仅适用于具有@user 变量的控制器。我想知道是否有一些聪明的方法可以在不硬编码名称的情况下获取此类实例变量 (@user)。在每个控制器中它都不同,但它对应于当前控制器名称 @user for UsersController 等。

感谢您的帮助。不幸的是,我只能接受一个答案:)

可能的解决方案

我最终得到了辅助方法:

  def errors_present?
    # returns string like "UsersController" with support for name-spaced controllers
    controller_name = controller.class.to_s.split('::').last

    # extract out the "user" portion
    prefix_name = controller_name.gsub(/controller/i, '').singularize.downcase

    # is there a defined instance variable with this name?
    i_var = controller.instance_variable_get(:"@#{prefix_name}")

    return i_var.errors.present? if i_var != nil

    false
  end

并查看代码:

- if errors_present?
  .alert-box.alert{ data: { alert: true } }
    %div= t('simple_form.error_notification.default_message')

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果您的所有控制器都遵循相同的命名约定,那么实例变量名称就是控制器的单数名称。您可以将@user 替换为以下内容:

    instance_variable_get("@#{controller.controller_name.singularize}")
    

    如果你将它移到 application_helper.rb 中的辅助方法中:

    def controller_record
      instance_variable_get("@#{controller.controller_name.singularize}")
    end
    

    然后您可以在视图中引用 controller_record:

    - if controller_record.errors.present?
      .alert-box.alert{ data: { alert: true } }
      %div= t('simple_form.error_notification.default_message')
    

    【讨论】:

      【解决方案2】:

      如果您要在动态路由中执行此操作,则需要确保您使用的实例变量与可以从控制器名称推断出的变量相匹配。然后,您可以在辅助方法中使用它。

        def controller_error_present
          # returns string like "UsersController" with support for name-spaced controllers
          controller_name = controller.class.to_s.split('::').last
      
          # extract out the "user" portion
          prefix_name = controller_name.gsub(/controller/i, '').singularize.downcase
      
          # is there a defined instance variable with this name?
          controller.instance_variable_get(:"@#{prefix_name}") != nil
        end
      

      用法如下:

      - if controller_error_present
       .alert-box.alert{ data: { alert: true } }
          %div= t('simple_form.error_notification.default_message')
      

      只要您在控制器中初始化 @user 变量,实例变量检查就会获取该变量。

      【讨论】:

      • 您的 controller_error_present 方法从不实际检查是否存在错误。它只检查实例变量是否存在。
      • @infused 你是对的 - 我错过了。幸运的是,这是一个微不足道的修复:)
      猜你喜欢
      • 1970-01-01
      • 2012-08-13
      • 2015-01-20
      • 1970-01-01
      • 2011-08-30
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多