【发布时间】:2020-06-10 13:03:58
【问题描述】:
假设我有这样的模型:
class Item < ApplicationRecord
end
在items#new 或items#edit,在app/views/items/_form.html.erb:
<%= f.submit %>
这将根据路由生成一个名为“创建项目”或“更新项目”的提交按钮。
现在我想为生成的按钮文本使用一个替代名称(仅在此处!),例如“创建文章”和“更新文章”,同时在代码中的其他任何地方保留名称 Item,这样我就可以仍然使用items_url、ItemsHelper::some_method等。
使用<%= f.submit "Text" %> 不是一个选项,因为当相同的表单在不同视图中呈现时,它不会保持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中的建议做
<%= f.submit "My Submit Text" %> -
@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