2010-11-14 179 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 

然而,當我在項目視圖中從i​​ndex.html.erb文件運行該EXACT代碼時,它完美地工作。

那麼我怎麼能夠訪問該控制器或至少從另一個控制器的視圖中的數據?我是否需要在我的設計器控制器中向我的索引對象添加一個項目變量(它查詢數據庫的位置)?

謝謝。

+0

你能鏈接模型和控制器嗎? – rwilliams 2010-11-14 07:31:21

+0

@ r-dub,你是指在這裏發佈它們還是可以將它們鏈接到Rails? – marcamillion 2010-11-14 07:41:00

回答

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 2010-11-16 08:17:57

+0

通常情況下,您將使用索引操作來顯示模型對象的列表,並且您將對單個對象使用show操作,所以我認爲您希望在此列出一個列表。答案更新爲使用單個記錄。 – johnmcaliley 2010-11-16 13:06:50

1

想通了一種方法來做到這一點。我所要做的只是在我的設計師控制器中添加一個實例變量:

@projects = Project.all 

但是...這不是很乾燥。有沒有人有更優雅的'幹'解決方案,所以如果我想訪問其他控制器中的其他變量,我可以輕鬆地做到這一點,而無需在當前的控制器中重新創建它們?

謝謝。

+0

@cowboycoded ....你是對的。那不是我的意圖。我只想要與設計師相關的項目登錄。並非系統中的所有項目。 – marcamillion 2010-11-15 06:10:21

0

在你的設計師控制器,你需要設置@projects實例變量,只有那些屬於簽名設計師的項目,是否正確?

你需要這樣的事:

def index 

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

end 

我希望這有助於。

相關問題