ruby-on-rails – 覆盖模型属性读者不会影响simple_form输入字段

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 覆盖模型属性读者不会影响simple_form输入字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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更好).

猜你在找的Ruby相关文章