问题很简单。我想在我的应用中的每个控制器的simple_form_for
标记之外显示错误通知。
我使用以下代码:
- if @user.errors.present?
.alert-box.alert{ data: { alert: true } }
%div= t('simple_form.error_notification.default_message')
哪个好,但仅限于一个带@user
变量的控制器。我想知道是否有一些聪明的方法来获取此类实例变量(@user
)而不对该名称进行硬编码。在每个控制器中它的不同但它与@user
等的当前控制器名称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')
答案 0 :(得分: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')
答案 1 :(得分:0)
如果您要在动态路由中执行此操作,则需要确保您使用的实例变量与从控制器名称推断出的实例变量相匹配。然后,您可以在辅助方法中使用它。
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
变量,就会比实例变量检查更新。