Rails – text_field中的默认值,但仅适用于new_record?

在内容模型上有一个名为slug的属性。 在创建新记录时,我想使用帮助程序来填充此字段,但在现有记录上,我想使用数据库中的值。

目前我有:

   "#{generate_slug(6)}" %>    

但这看起来有点冗长。 这是最好的方式,还是别的办法? (Rails newb只是想在我不确定的问题上找到“Rails方式”)


编辑

我应该注意,帮助程序当前位于/app/helpers/application_helper.rb中 已移至内容控制器中的私有操作。 大卫的回答很有效。

在你的控制器中

 @content.slug ||= generate_slug(6) 

如果不存在,这将为slug属性赋值

然后,在您的视图中,您可以简单地使用

 <%= f.text_field :slug %> 

选项

  1. 在模型中尝试after_initialize回调。
  2. 尝试在模型中创建一个设置默认值的方法,并在控制器中的新操作中调用它。 如果您的创建失败并且您呈现新的,也请调用此方法。 请记住,只有在没有值时才使用|| =运算符设置默认值。

示例如下。 我正在打电话!

我碰巧在我的项目中使用jQuery,所以当我想要这样的function时,我通常使用像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?) %> 

不要忘记周围的parens (generate_slug(6) if @content.new_record?) 。 如果这样做, if将应用于text_field,这不是你想要的。

但还有更多方法可以做到这一点。 如果您的逻辑可能会发生变化并且您在rails项目中粘贴此代码,则上面的代码行不是很好。 当我想在我的文本字段中添加“必需”类时,但仅当它们是新记录时(我们有一些我们不想让人们清理的遗留数据),我创建了自己的表单构建器,其中包含required_field如果该项是新记录, text_field调用text_field并添加“必需”类的方法。 这似乎是一项工作,但我们有大约20种不同的forms,每种forms都有可能的多个必填字段,而且在一个地方更改业务逻辑要容易得多。 因此,如果你真的认为这个逻辑属于视图,但你有大量的这些代码行,并且你不想在一百万个地方改变它,那么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 %> 

希望所有这些不同的方法适合您的项目。