【问题标题】:Use custom name in auto-rendered HTML in Rails 6在 Rails 6 的自动渲染 HTML 中使用自定义名称
【发布时间】:2020-06-10 13:03:58
【问题描述】:

假设我有这样的模型:

class Item < ApplicationRecord
end

items#newitems#edit,在app/views/items/_form.html.erb

<%= f.submit %>

这将根据路由生成一个名为“创建项目”或“更新项目”的提交按钮。

现在我想为生成的按钮文本使用一个替代名称(仅在此处!),例如“创建文章”和“更新文章”,同时在代码中的其他任何地方保留名称 Item,这样我就可以仍然使用items_urlItemsHelper::some_method等。

使用&lt;%= f.submit "Text" %&gt; 不是一个选项,因为当相同的表单在不同视图中呈现时,它不会保持Create %{model}Update %{model} 之间的差异。

我做了以下尝试但没有成功:

# 1 - no difference observed
class Item < ApplicationRecord
  def display_name
    "Object"
  end
end

# 2 - undefined method `name' for "Artlcle":String
class Item < ApplicationRecord
  def model_name
    "Object"
  end
end

# 3 - undefined method `object_path'
class Item < ApplicationRecord
  def model_name
    ActiveModel::Name.new Item, nil, 'Object'
  end
end

这也不是一个好的解决方案,因为它违反了 Rails 的 DRY 原则。

<% if determine_controller %>
  <%= f.submit "Some text" %>
<% else %>
  <%= f.submit "Some other text" %>
<% end %>

我如何实现这个目标?没有rails-i18n可以吗?

附加问题:您回答中的解决方案是否也适用于 Rails 5?

【问题讨论】:

  • 有什么原因你不能按照this answer中的建议做&lt;%= f.submit "My Submit Text" %&gt;
  • @lacostenycoder 这将保留Create %{model}Update %{model}之间的差异。
  • 用 javascript 做这件事会不会杀了你?
  • @lacostenycoder 有比使用 JS 更好的解决方法。
  • 我同意使用 erb 可以更轻松地完成此任务,但是要回答您的问题,您可以尝试将 model_name 方法更改为 ActiveModel::Name.new(Item, nil, 'Object') 而不仅仅是 "Object"

标签: ruby-on-rails ruby ruby-on-rails-6


【解决方案1】:

也许有点太老套了,但是猴子补丁可以完成这项工作(感谢 @AbM 提供到 Rails 源的链接):

class Item < ApplicationRecord
  def model_name.human
    'Article'
  end
end

为了让生活更轻松,我在基类中编写了一个“辅助方法”:

class ApplicationRecord < ActiveRecord::Base
  def self.display_name(name)
    self.model_name.define_singleton_method :human do
      name
    end
  end
end

然后我可以这样做:

class Item < ApplicationRecord
  display_name 'Article'
end

【讨论】:

  • 如何通过此解决方案将单词 Article 添加到您的按钮中?
  • 很公平,但我想为了清楚起见,使用您的问题中提出的相同名称并没有什么坏处,这样其他用户可能会发现这个问题并回答更有帮助。
  • @lacostenycoder 完全有效!我已经更新了我的答案。
猜你喜欢
  • 2022-01-10
  • 2011-07-14
  • 2017-04-19
  • 2014-06-06
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
相关资源
最近更新 更多