3

、または他のオブジェクトUserが好きなデータモデルがあります。Project, Suggestion, Commentモデルは正しく設定されており、子供likes/show.rablをサポートするだけであれば機能しますProject

object @like
attributes :id, :created_at, :target_type, :target_id, :user_id
child :user => :user do
  extends "users/show"
end
child :target do
  node do |project|
    partial('projects/show', :object => project)
  end
end

suggestions/show, comments/showただし、によってはのパーシャルも使用できるようにしたいtarget_type

私はこれを試しましたが、うまくいきません:

child :target do |u|
  u.target.map do |r|
    if r.is_a?(Suggestion)
      partial("suggestions/show", :object => r)
    elsif r.is_a?(Project)
      partial("projects/show", :object => r)
    end
  end
end

私は得るundefined method target for <Rabl::Engine:0x69fb988>。ただし、最初のケースではこのエラーは発生しません。何か案は?

4

3 に答える 3

3

これは私が最終的に使用したもので、うまくいきました。

この投稿のおかげで: https://github.com/nesquena/rabl/issues/273#issuecomment-6580713

child :target do
  node do |r|
    if r.is_a?(Suggestion)
      partial("suggestions/show", :object => r)
    elsif r.is_a?(Project)
      partial("projects/show", :object => r)
    end
  end
end
于 2012-06-27T09:59:37.747 に答える
3

extendsの代わりに使用してみましたpartialか?

おそらく、あなたはこのようなことを試すことができますか?

child :target do |u|
  u.target.map do |r|
    if r.is_a?(Suggestion)
      extends "suggestions/show"
    elsif r.is_a?(Project)
      extends "projects/show"
    end
  end
end

この場合、 を使用するときにextends、 を渡す必要はありません:object。これは、既に object を反復処理する範囲内にあるためですr

于 2012-06-26T21:33:32.770 に答える
1

これを行う別の方法があります。可能なポリモーフィックな関係をすべてリストする必要はありません。少しハックかもしれませんが、うまくいきます。

このような:

child :target do |u|
  # The regexp snippet selects everything from the last / and to the end
  extends u.to_partial_path.gsub(/\/([^\/]+)$/, '/show')
end

これは、.to_partial_pathオブジェクトの を使用します。オブジェクトが呼び出された場合Suggestion、 は.to_partial_pathを返しsuggestions/suggestionます。これが、後にgsub()来るものを に置き換えるために使用している理由です。//show

このソリューションを使用すると、別のポリモーフィック リレーションを追加するたびにこのファイルを更新する必要がなくなります。新しいオブジェクトに rabl テンプレートが含まれていることを確認する必要があるだけです。show.json.rabl

于 2014-08-22T13:27:39.313 に答える