ActiveRecord::Store 在 3.2 的更高版本中是否发生了变化?我在搜索中找不到很多关于它的信息。有些人认为这很好,有些人有意见。有一些早期的 3.2 发布博客条目,大多数只是使用控制台更新 ActiveRecord::Store 中的属性。有一些 示例/教程将其与表单一起使用。大多数人像列一样使用商店属性,但我无法让它工作。也无法使某些控制台示例正常工作。
class Stage < ActiveRecord::Base
AD_ATTR = [:job_area, :end_date, :ad_url, :instructions, :other]
store :ad, :assessors => AD_ATTR
attr_accessible *AD_ATTR, :date, :enterable, :est_candidates, :name, :status, :program_id, :sequence
end
# I've also tried it without the * and defining each accessor
一些教程显示使用对象点表示法从控制台使用存储。我的不工作。将其用作哈希可以正常工作。
1.9.2-p136 :752 > s = Stage.find(1)
=> #<Stage id: 1, ... , ad: {}, sequence: 1>
1.9.2-p136 :753 > s.ad
=> {}
1.9.2-p136 :754 > s.other
NoMethodError: undefined method `other' for #<Stage:0x00000103de4528>
1.9.2-p136 :755 > s.ad[:other]
=> nil
1.9.2-p136 :756 > s.other = "stuff"
NoMethodError: undefined method `other=' for #<Stage:0x00000103de4528>
1.9.2-p136 :757 > s.ad[:other] = "stuff"
=> "stuff"
1.9.2-p136 :758 > a.other
NoMethodError: undefined method `other' for #<Take::Assessment:0x000001038ba778>
然后以一种形式,如果我尝试:
<tr class="field">
<th><%= f.label :other %></th>
<td><%= f.text_field :other %></td>
</tr>
我去拿:
undefined method 'other' for #<Stage:0x0000010396a650>
我确信我可以破解它,或者像我在其他几个地方一样使用 JSON。这似乎很合适,因为只有少数 Stage 记录需要广告属性。
编辑
无法帮助自己进行黑客攻击。我让它工作了,但是,根据我能找到的东西,它应该只是一个模型属性。
在表单中,我使用了 fields_form:
<%= fields_for :ad_fields do |a| %>
<tr class="field">
<th><%= a.label :other %></th>
<td><%= a.text_field :other, :value => @stage.ad[:other] %></td>
</tr>
<tr class="field">
<th><%= a.label :job_area %></th>
<td><%= a.text_field :job_area, :value => @stage.ad[:job_area] %></td>
</tr>
<% end %>
在更新控制器中,我填充了商店。
def update
@stage = Stage.find(params[:id])
respond_to do |format|
if params[:ad_fields]
params[:ad_fields].each do |key,value|
@stage.ad[key.to_sym] = value
end
end
if @stage.update_attributes(params[:stage])
...
end
使用此方法,您还可以将其他对象放入值中,其中有人已经拥有 gem store_field。我的 hack 至少可以让我使用 ActiveRecord::Store 进行评估
史蒂夫