2010-11-14 4 views
0

Итак, у меня есть две модели: & контроллеры. Проекты и дизайнеры.Как получить доступ к переменной экземпляра с другого контроллера?

В моем представлении индексов дизайнеров я хочу, чтобы он показывал список всех проектов, которые имеет дизайнер.

Однако, когда я делаю простой запрос, как это:

<% @projects.each do |project| %> 
    <tr> 
    <td><%= link_to 'Show', project %></td> 
    <td><%= link_to 'Edit', edit_project_path(project) %></td> 
    <td><%= link_to 'Destroy', project, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 

С index.html.erb в представлении дизайнеров, это дает мне следующую ошибку:

NoMethodError in Designers#index 
You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

Однако, когда я запускаю этот ТОЧНЫЙ код из файла index.html.erb в представлении проектов, он отлично работает.

Как я могу получить доступ к этому контроллеру или, по крайней мере, данные из вида другого контроллера? Должен ли я добавлять переменную проектов (где она запрашивает db) к моему объекту индекса в контроллере дизайнеров?

Спасибо.

+0

Вы можете связать модели и контроллеры? – rwilliams

+0

@ r-dub, вы имеете в виду размещение их здесь или я могу связать их в Rails? – marcamillion

ответ

3

ОБНОВЛЕНО использовать один КОНСТРУКТОР RECORD

Вы должны использовать ассоциации. Добавьте это в свои модели.

class Designer < ActiveRecord::Base 
    has_many :projects 
end 

class Project < ActiveRecord::Base 
    belongs_to :designer 
end 

Ваше мнение должно выглядеть следующим образом:

<% @designer.projects.each do |project| %> 

<% end %> 

Более подробная информации об ассоциациях здесь: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+0

Что мне действительно нужно для каждой страницы индекса дизайнеров, т. Е. После входа в систему, они видят список всех своих проектов. Так что это не так, как в этом примере. Если я не ошибаюсь, функциональность, которую вы добавили здесь, по сути, позволяет кому-то с разрешения просматривать всех дизайнеров и все их проекты, не так ли? В отличие от одного дизайнера, просматривающего все свои проекты. – marcamillion

+0

Обычно вы должны использовать действие индекса для отображения списка объектов модели, и вы должны использовать действие show для одного объекта, поэтому я думал, что вам нужен список здесь. Ответ обновляется, чтобы использовать одну запись. – johnmcaliley

1

Выяснен один из способов сделать это. Все, что мне нужно было сделать, это добавить переменную экземпляра в контроллер дизайнеров:

@projects = Project.all 

Но ... это не очень СУХОЙ. У кого-нибудь есть более элегантное решение «СУХИЕ», поэтому, если я хочу получить доступ к другим переменным в других контроллерах, я могу сделать это легко, не создавая их в текущем контроллере?

Спасибо.

+0

@cowboycoded .... вы правы. Это не мое намерение. Я хочу, чтобы в проект вошли только проекты, связанные с проектировщиком. Не все проекты в системе. – marcamillion

0

В контроллере конструкторов, вам нужно установить переменную @projects экземпляр только те, проекты, принадлежащие подписанному дизайнеру, правильно?

Вам нужно что-то вроде этого:

def index 

    @projects = Project.where(:user_id => where ever you've stored your userid) 

end 

Я надеюсь, что это помогает.

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