2016-05-11 42 views
1

我有用戶模型,有很多細節。如何link_to主對象在視圖中看起來更乾淨?

在詳細列表(索引)頁面(./details)中有一個link_to備份主表或擁有詳細信息的用戶(./user/1)。

基本上,我想知道是否有辦法使link_to方法的語法,使用ruby或rails約定來查看任何清理器,但我不知道。

<% @details.each do |detail| %> 
    <tr> 
    <td><%= detail.name %></td> 
    <td><%= link_to User.find_by_id(detail.foreign_key_id).name, \ 
      User.find_by_id(detail.foreign_key_id) %></td> 
    ... 

這工作得很好,但我似乎記得在某個時候看到一個更清晰的語法。

[編輯] 也在這種情況下,我有兩種方式,用戶可以關聯到細節。

我在想的數據模型與項目類似,所以我將以這種方式提出問題。因此,用戶可以是項目的所有者,和/或項目的贊助商

所以,User類將有以下....

class User < ActiveRecord::Base 
    has_many :owned_projects, class_name: "Project", foreign_key: :owner_id 
    has_many :sponsored_projects, class_name: "Project", foreign_key: :sponsor_id 
end 

那麼該項目類將有此在它的定義

class Project < ActiveRecord::Base 
    belongs_to :owner, :foreign_key => :owner_id, :class_name => "User" 
    belongs_to :sponsor, :foreign_key => :sponsor_id, :class_name => "User" 
end 

工作表中同時具有owner_id字段和sponsor_id字段,所以用戶類可以鏈接兩次到項目表。

鑑於所有這一切,回到手頭上的問題,我不知道如何使用更清晰的語法由@Michael Gaskill

描述如果是像她那樣,它會是這樣? %= link_to @project.sponsor.name, project.sponsor_id %></td>

Rails 魔法似乎沒有弄清楚,或者我已經配置錯了。

我已經測試過以下,這將工作,正如我前面提到的,但我試圖確保沒有更簡潔的方法。

(目標是看到有關的詳細信息頁面,或項目在這個例子中,看看用戶關聯到它的兩個類別,並有他們的名字可以點擊鏈接到他們的顯示 PAGE圖譜)

<p> 
    <strong>Name:</strong> 
    <%= @project.name %> 
</p> 

<p> 
    <strong>Owner:</strong> 
    <%= link_to User.find_by_id(@project.owner_id).name, User.find_by_id(@project.owner_id) %> 
</p> 

<p> 
    <strong>Sponsor:</strong> 
    <%= link_to User.find_by_id(@project.sponsor_id).name, User.find_by_id(@project.sponsor_id) %> 
</p> 
+0

您是否得到了適合您的答案? –

回答

2

如果你的人際關係的設置是否正確,你應該能夠做這樣的事情:

%= link_to detail.user.name, detail.user %></td> 

如果您可以提供幫助,您希望避免在視圖中執行任何ActiveRecord查詢。如果您必須在視圖中執行查詢,請確保您沒有複製它們。視圖中的查詢往往會導致N + 1問題,並且複製它們可能導致該問題變爲2 *(N + 1),或更糟糕。

根據您的問題顯示的新的關係,你應該能夠代替你的視圖代碼使用此:

<p> 
    <strong>Name:</strong> 
    <%= @project.name %> 
</p> 

<p> 
    <strong>Owner:</strong> 
    <%= link_to @project.owner.name, @project.owner) %> 
</p> 

<p> 
    <strong>Sponsor:</strong> 
    <%= link_to @project.sponsor.name, @project.sponsor) %> 
</p> 

簡單地說,Rails的魔法知道如何遍歷關係檢索名稱來自每個贊助商和所有者模型對象。同樣,link_to知道如何從發起人和所有者中自動檢索路徑信息(作爲link_to的第二個參數給出)來爲每個對象創建正確的鏈接。請注意,這適用於使用模型對象(例如「所有者」)而不是object_id(例如「owner_id」)。

link_to API documentation給出了關於如何將link_to與您的模型數據一起使用的更深入的指導。示例#2演示了此答案使用的確切技術;然而,我們選擇直接從ActiveRecord模型(作爲所有者或贊助商名稱)提供鏈接文本,而不是像在示例中那樣對其進行硬編碼。

通過使用路由助手來定義要使用的路徑,您還可以更明確地指出要鏈接到哪條路徑。讓我們展示瞭如何鏈接到編輯頁面的項目業主和贊助商了類似的看法頁:

<p> 
    <strong>Name:</strong> 
    <%= @project.name %> 
</p> 

<p> 
    <strong>Owner:</strong> 
    <%= link_to @project.owner.name, edit_owner_path(@project.owner) %> 
</p> 

<p> 
    <strong>Sponsor:</strong> 
    <%= link_to @project.sponsor.name, edit_owner_path(@project.sponsor) %> 
</p> 

你可以使用任何路由助手Rails所創建您導航到任何的你模型的行爲。要找出哪條路線助手可爲您的項目,你可以在命令行運行rake routes,並看到這樣的結果:

 Prefix Verb URI Pattern     Controller#Action 
    projects GET /projects(.:format)   projects#index 
      POST /projects(.:format)   projects#create 
new_project GET /projects/new(.:format)  projects#new 
edit_project GET /projects/:id/edit(.:format) projects#edit 
    project GET /projects/:id(.:format)  projects#show 
      PATCH /projects/:id(.:format)  projects#update 
      PUT /projects/:id(.:format)  projects#update 
      DELETE /projects/:id(.:format)  projects#destroy 
     users GET /users(.:format)    users#index 
      POST /users(.:format)    users#create 
    new_user GET /users/new(.:format)   users#new 
    edit_user GET /users/:id/edit(.:format) users#edit 
     user GET /users/:id(.:format)   users#show 
      PATCH /users/:id(.:format)   users#update 
      PUT /users/:id(.:format)   users#update 
      DELETE /users/:id(.:format)   users#destroy 

這是一套標準的在你的config/routes.rb這些定義來定義路線:

resources :project 
resources :user 

在輸出rake routes,你看到在左邊的「前綴」列中顯示的路線傭工。這些標識符將用於向顯式頁面鏈接提供link_to。這些被稱爲「前綴」,因爲它們分別用於「路徑」或「網址」以生成相對路徑或絕對網址。考慮這些用途:

user_path(@project.owner)  # ==> "/user/9" 
user_url(@project.sponsor)  # ==> "http://example.com/user/23" 
new_user_path     # ==> "/user/new" 
new_user_url     # ==> "http://example.com/user/new" 

請注意,有些路由助手必須指定參數,有些則不需要。您可以從rake routes輸出中讀取此參數,因爲參數是按替換參數(例如:id)的出現順序提供的,不包括可選替換參數(例如(。:格式))。該標準設定爲一個資源路線給你,你可以使用這些路線助手:

users_path      # ==> "/user" 
new_user_path     # ==> "/user/new" 
user_path(@user)    # ==> "/user/139" 
edit_user_path(@user)   # ==> "/user/139/edit" 

其他默認路由通常不直接在項目中使用,這樣你就不會直接引用他們。

所以,你有一個模型對象的任何時候,你可以創建任何你想要使用的鏈路,或者使用隱式路徑的方法:

<%= link_to @user.name, @user %> 

或路徑助手的方法:

<%= link_to @user.name, user_path(@user) %> 

這兩個應該產生用戶#69, 「斯科特Tenorman」 相同鏈接:

<a href="/user/69">Scott Tenorman</a> 

這就是魔法。這並不是什麼神奇的東西,而是一系列聰明,精心製作的約定,它們協同工作,輕鬆實現簡單的事情。一旦你知道他們是如何工作的。快樂連結!

+0

對不起,遲到回覆你,謝謝你的回答。 但是,你的意思是User類應該用'has_many ...'而不是'belongs_to'來定義? Detail屬於我的用戶。 另外,我確實嘗試使用這種方法,但它不適合我。我想我並沒有分享我想要做的事情的複雜性,這可能會使這個簡化的代碼工作。用戶類可以有兩種不同的細節關係。我會盡力改進我的問題來解釋這一點。 –

+0

好的。一定是睡眠不足導致的。我已經更新了我的回答,以更好地描述機制如何工作,並揭示了模型,Rails路線,路線助手以及'link_to'如何將它們結合在一起的一些魔術。 –

相關問題