1

コレクションのjsonをレンダリングするときに使用するオブジェクト(現在のユーザー)を渡そうとしています。

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @items }
  format.json { render :json => @items.to_a.as_json(:user => current_user) }
end

ただし、as_json メソッドでは options[:user] が nil であるため、これは効果がないようです。

JSON_ATTRS = ['id', 'created_at', 'title', 'content']
def as_json(options={})
  # options[:user] is nil!
  attributes.slice(*JSON_ATTRS).merge(:viewed => viewed_by?(options[:user]))
end

なぜこれがうまくいかないのか、またはjsonレンダラーに現在のユーザーを認識させるよりエレガントな方法を提案できる人はいますか?

ありがとう、魏

4

2 に答える 2

1

配列()でas_jsonを呼び出していますが、それでよろしい@items.to_aですか?モデルでそれを呼び出そうとしている場合は、次のようなことを行う必要が@items.to_a.map{|i| i.to_json(:user => current_user)} あります(おそらく、は必要ありませんto_a)。

そして、それはto_jsonあなたが呼ぶべきであるということです。as_jsonを呼び出してプロパティを取得し、指定したオプションを渡しますが、適切にフォーマットされたjson-stringをas_json返します(rubyオブジェクトを返します)。

于 2010-09-14T08:16:08.040 に答える
0

ところで、オプションを「子」アソシエーションに渡したい場合、これが機能することがわかりました(少なくともmongo_mapperが支援するプロジェクトでは):

def as_json(options={})
  {
      :field1   => self.field1,
      :field2   => self.field2,
      :details  => self.details.map{|d| d.to_json(options)}
  }
end
于 2012-02-07T23:10:26.313 に答える