2012-06-26 2 views
3

У меня есть модель данных, где User может понравиться Project, Suggestion, Comment или другими объектами. модели установлены правильно, и likes/show.rabl работает, если мы были просто, чтобы поддержать Project ребенкаRender частичные части RABL с полиморфными моделями

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>. Тем не менее, я не получаю эту ошибку в первом случае. Есть идеи?

ответ

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, потому что вы уже в рамках перебора с объектом r.

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 
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

Смежные вопросы