1

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 を使用できると確信しています。広告属性を必要とするステージ レコードはごく少数であるため、これは適切なように思われました。

編集

ハッキングから逃れられませんでした。私はそれを機能させましたが、私が見つけたものによると、それは単なるモデル属性として機能するはずです.

フォームでは、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 を持っています。私のハックは、少なくとも ActiveRecord::Store を使用して評価できるようにします

スティーブ

4

0 に答える 0