2011-01-30 1 views
0

У меня был контроллер, возвращавшегося всех статьи моего сайтаРубин на Rails Collect Возвращает вложенный массив (переменный: неопределенный метод `MODEL_NAME» для массива: Class)

@articles = Article.find(all) 

и частичная, который используется для визуализации массив @articles.

Я изменил мой контроллер:

@articles = User.find(1).topics.map { |t| t.articles } 

Так что я могу вернуть некоторые другие данные, а также

После осмотра на консоли Rails я обнаружил, что проблема заключается в том, что выходной массив Collect не соответствует Article.find (все)

Выходной массив находке (все)

[#<Article id: 1, user_id: 2, title: "test">] 

Выходной массив сборным

[[#<Article id: 1, user_id: 2, title: "test">]] 

Когда я пытаюсь оказать parcial я получаю:

variable:undefined method `model_name' for Array:Class 

Мой индекс

<%= render :partial => @articles%> 

, а затем parcial:

<%= link_to_unless_current h(article.title), article %> <%= h(article.body) %> 

Есть ли кто знает, как преодолеть проблему с помощью двух скобок [[]] массива?

ответ

1

Во-первых, для первой строки, я думаю, что у вас есть опечатка, который должен быть :all вместо all: D

t.articles возвращает вас сборник статей.

Так map {|t| t.articles} дает вам коллекцию коллекций статей (массив массивов).

Вы можете попробовать это:

@articles = User.find(1).topics.map { |t| t.articles }.flatten.uniq 
# uniq if an article could belongs to two or more topics. Otherwise it is not needed. 
+0

': all' вместо' all' ... любые проблемы ..? – PeterWong

+0

пункт flatten.uniq работал! спасибо добавить! – Sharethefun

+0

О, я наконец понял ... Я, ты прав ~! – PeterWong