Rails 5覆盖dom_id辅助方法

时间:2017-01-14 11:26:14

标签: ruby-on-rails ruby-on-rails-5 override helpers

我遇到了一个奇怪的问题。我们有一个项目,其中 - 出于安全原因 - 我们希望避免显示大多数模型的ID。因此,我们不想使用dom id user_12,而是使用序列号(id="user_adsi94zurew")。首先我们手动给它全部(就像在这两个haml行中):

.user_line{id: "user_#{@user.serial}"}
= form_for @user, url: user_path(@user), id: {"edit_user_#{@user.serial}"}

这不好,我们不喜欢它。然后我找到了帮助方法dom_id,我以application_helper方式覆盖了以下方式:

def dom_id(record, prefix = nil)
  if record.respond_to?(:serial)
    "#{dom_class(record, prefix)}_#{record.serial}"
  else
    super
  end
end

它在大多数情况下都运行良好,但我没有时间进行全面测试,因为 - 随着我们的应用程序变得越来越大 - 我们需要重写它。我们更改为 Rails 5.0.0.1 并开始在模块(文件夹)中对控制器进行排序。我将代码复制到我们的新application_helper.rb,我发现它无效(它返回了旧的user_12)。然后我发现,它正在工作,然后再次,它不是。就是这样:它几乎完全随机,无论何时何地起作用。我做了一些测试,发现当不工作时,我的代码甚至没有运行(因此不是条件评估为false),该方法直接进入原始dom_id,就好像我一点也不存在!

然后我发现一些反对我的随机理论的规则,但这些甚至更奇怪:

1。)在文件/app/views/company_manager/companies/edit.html.haml以及new.html.haml(同一文件夹)中,它永远不会有效。我的第一个想法是,这是由于模块CompanyManager

2.)在root/app/views/landings/landing_page.html.haml)中,它有效。然后它没有!但是如果我在辅助方法中做了任何更改(添加p 'here',或者甚至是空的新行(!)),它又会再次运行!

3。)在部分/app/views/company_manager/regions/_region.html.haml.region_line{id: dom_id(region)})中它没有用,但在ajax响应update.js.erb(同一文件夹)中它(至少偶尔) 。由于这个原因,我有一段艰难的十分钟,因为我尝试使用以下jQuery代码更新DOM中的区域行:$('#<%= dom_id(@region) %>').replaceWith('<%= j(render @region) %>');,并且dom_id首先返回region_6region_hd5j8g6 1}}第二,jQuery无法找到要更新的行。

4.。)最后,我们使用old方式从控制器访问辅助方法(这意味着ApplicationController中的include ApplicationHelper)。当方法返回company_31时,我尝试从控制器引用它,并且它引发了NoMethodError,而ApplicationHelper中的其他帮助方法仍然可以访问。

结论:在我看来,当Rails合并辅助方法时,有时我的方法会覆盖原始方法,有时反之亦然。如果服务器已在运行,并且我在我的方法中进行了一些更改,Rails似乎只重新加载application_helper.rb,所以这是我的方法高于原始方法(尽管它仍然对companies/edit没有影响或regions/_region)......

有什么想法吗?其他解释?什么,我错过了?任何提示?

(注意:有替代方案,谢谢,我装备齐全。如果没有解决方案,我会将方法重命名为dom_id_serial,并试图说服form_for使用它而不是{{} 1}},或任何其他。所以我对覆盖dom_id并且工作的任何内容感兴趣,或者对覆盖的任何原因感兴趣,而不是其他任何内容。)

提前致谢!

0 个答案:

没有答案