我使用simple_form并且想覆盖读者的模型属性.
因此以下不行
class C < ActiveRecord::Base # it has attribute named pack def pack "Some value" end end
鉴于以下代码
<%= simple_form_for @c do |f| %> <%= f.input :pack %> <% end %>
因此它应该显示具有值“Some value”的输入框的形式,但它是空白的.为什么不用simple_form覆盖?
解决方法
我想到这一点,我的评论基本上是正确的,simple_form倾斜于Rails形式的帮助者,它使用read_attribute从ActiveRecord对象获取值,从而读取数据库中的值,而不是使用您的方法.耦合持久性/域/表示的症状.这样做的方法是:
<%= f.input :pack,:input_html => { :value => @c.pack } %> # or <%= f.input :pack,:input_html => { :value => f.object.pack } %>
或者如果您希望这是默认行为,您可以在simple_for之上创建自己的表单构建器,例如:
# lib/my_form_builder.rb ** class MyFormBuilder < SimpleForm::FormBuilder def input(attribute_name,options={},&block) options[:input_html] ||= {} options[:input_html][:value] = object.send(attribute_name) super(attribute_name,options,&block) end end
在你的形式:
<%= simple_form_for @c,:builder => MyFormBuilder do |f| %> <%= f.input :pack %> <% end %>
**在Rails 3我不认为lib默认添加到加载路径,所以你可能需要添加它并重新启动应用程序或将其放在应用程序/模型中(免责声明不是一个好主意,lib更好).