我碰巧在我的项目中使用 jQuery,所以当我想要一些类似的功能时,我通常使用类似 labelify 的东西。然后,我会使用<%= f.text_field :slug, :title => generate_slug(6) %> 之类的东西。 (热点提示,如果 #generate_slug 调用返回的内容会自行解析为字符串,则不需要将调用放在字符串中,事实上,如果不这样做,它的性能会更高。)
如果您不想使用 jQuery 方法,您可能希望将这段逻辑包装在您的模型中。
def Content < ActiveRecord::Base
def slug
self.new_record? ? self.slug_for_new_record : attributes[:slug]
end
private
def slug_for_new_record
# I don't know what you're doing in generate_slug, but it sounds model-
# related, so if so, put it here and not in a helper
end
end
如果它真的属于视图,还有一个选择是让你的 Ruby 更简洁一点(你必须判断这是否更具可读性):
<%= f.text_field :slug, :value => (generate_slug(6) if @content.new_record?) %>
不要忘记(generate_slug(6) if @content.new_record?) 周围的括号。如果这样做,if 将应用于 text_field,这不是您想要的。
但还有更多方法可以做到这一点。如果您的逻辑可能会发生变化并且您将此代码粘贴到您的 Rails 项目中,那么上面的代码行就不是很好。当我想在我的文本字段中添加一个“必需”类时,但前提是它们是新记录(我们有一些不想让人们清理的遗留数据),我创建了自己的表单构建器,带有 @ 987654328@ 刚刚调用 text_field 的方法,如果项目是新记录,则添加一个“必需”类。这看起来像是一项工作,但我们有大约 20 种不同的表单,每个表单都可能有多个必填字段,并且在一个地方更改业务逻辑要容易得多。因此,如果您真的认为该逻辑属于视图,但您有大量这些代码行并且您不想在一百万个地方更改它,那么 FormBuilder 就是要走的路。我认为在大多数情况下,这比帮手更漂亮、更合适,但同样,美丽在旁观者的眼中。这是我的代码在某种程度上适合您的情况:
# config/environment.rb
ActionView::Base.default_form_builder = NamespacesAreFun::FormBuilder
# lib/namespaces_are_fun/form_builder.rb
module NamespacesAreFun
class FormBuilder < ActionView::Helpers::FormBuilder
def slug_field(method, options = {})
opts = options.to_options
opts.merge!(:value => generate_slug) if self.object.new_record?
text_field(method, opts)
end
end
end
# views/.../your_view.html.erb
<%= f.slug_field :slug %>
希望所有这些不同的方法都适合您的项目。