0

さまざまなモデルのオブジェクトであるさまざまな ActiveRecord オブジェクトの配列があります。Teamのネストされたリソースであるそれらの1つが呼び出されますDepartment:

resources :departments do
  resources :teams
end

したがって、これを次のarray.eachように使用すると:

array.each do |element|
  link_to element.name, element
end

team_pathルートが呼び出されるネストされたリソースのために論理的なものは存在しないというエラーがスローされますが、department_team_pathこのメソッドで他のモデルのオブジェクトも処理するため、このメソッドを絶対に呼び出すことはできませんeach

私が見る 1 つの可能性は、Team#Show を参照する team_path という名前のルートを追加することですが、それはきれいではなく、SEO にとっても悪いことです。1 つのコースでこのモデルや他のモデルにリンクするための別のより良い可能性はありますか?

4

3 に答える 3

2
array.each do |element|
  if element.is_a?(Team)
   link_to element.name, url_for([element.department, element])
  else
    link_to element.name, element
  end
end

Railsガイドに従って。または、使用できますresources :departments, :shallow => trueが、あなたが述べたように、SEOにとって望ましくない結果になります.

于 2012-04-11T13:44:00.160 に答える
1

これを試して: link_to element.name, url_for(element)

于 2012-04-11T10:47:28.710 に答える
0

この問題に対処するための独自のメソッドを作成しました。彼らはに位置していますApplicationHeler

def nested_name(object)
    routes = Rails.application.routes.named_routes.to_a
    name = nil
    routes.each do |r|
      name = r[0].to_s if r[1].requirements[:controller] == object.class.to_s.downcase.pluralize && r[1].requirements[:action] == "show"
    end
    name
  end

def nested_object(object)
  name = nested_name(object)
  parent = name.gsub("_", "").gsub(object.class.to_s.downcase, "")
  if object.class.reflect_on_association(parent.to_sym)
    return [object.send(parent), object]
  else
    return object
  end
end

だから私は次のことができます:

array.each do |element|
  link_to element.name, nested_object(element)
end

それは今私にとってかなりうまくいっています...

于 2012-04-11T13:52:18.030 に答える