2013-05-19 146 views
2

我很新的軌道&我一直在這個問題上停留了幾個小時。我正在嘗試顯示用戶喜歡的帖子和用戶的實際帖子。Rails:顯示用戶喜歡的帖子和自己的帖子在同一頁

用我目前的代碼,我得到這個錯誤「未定義的方法標題爲#」,它是從這一行中提取:「<%= link_to post.title,post%>」。

有人對我如何讓這個工作有所瞭解嗎? (下面更多的代碼)

def show 
@user = User.find_by_username(params[:id]) 

if @user 
    @posts = @user.posts.all + @user.likes.all 
    render actions: :show 
    @likes = @user.likes.all 
else 
    render file: 'public/404', status: 404, formats: [:html] 
end 
end 

這是我的路線文件:

resources :likes, only: [:create, :destroy] 
resources :posts 

devise_scope :user do 
    get 'register', to: 'devise/registrations#new' 
    get 'edit', to: 'devise/registrations#edit' 
    get 'login', to: 'devise/sessions#new' 
    get 'logout', to: 'devise/sessions#destroy' 
end 

這裏的 '秀' 的看法:

<% if @posts %> 
    <% @posts.each do |post| %> 
    <%= link_to post.title, post %> 
    <% end %> 
<% end %> 

<%=的link_to post.title,後期% > display <%= post.inspect%>「這裏是結果

<Post id: 11, title: "testing123", user_id: 2, created_at: "2013-05-18 19:25:45", updated_at: "2013-05-18 19:25:45"> #<Like id: 23, post_id: 10, user_id: 2, created_at: "2013-05-18 21:39:17", updated_at: "2013-05-18 21:39:17"> 

它工作時,我只是用這個 - >@posts = @user.posts.all但是當我用這個問題開始 - >@posts = @user.posts.all + @user.likes.all

使我有「未定義的方法'稱號'」的短信..

+0

你可以發佈你的路由文件? –

+0

@derek_duncan剛剛添加了我的路線文件(編輯) – Jon

+0

你能否也顯示視圖在那一行? <%= link_to post.title,post%> – lis2

回答

2

你可能想添加一些用戶模型...

class User < ActiveRecord::Base 

    has_many :likes 
    has_many :liked_posts, :through => :likes, :source => :post 

    ... 

end 

然後,在你的控制器,你可以做到這一點

@posts = @user.posts + @user.liked_posts 
+0

哇這個工作!仍然習慣於在軌道協會..謝謝! – Jon

+0

是的 - '源'往往是令人困惑的部分。這是您用於執行:through的連接模型中的'belongs_to'。在這種情況下,後關聯是我們如何通過喜歡而不明確地稱它爲'帖子'(因爲已經採用了)。 – Swards

0

它似乎@[email protected]不會返回Post相關的陣列或ActiveRelation。

如果假設一個Like對象有post_id屬性,那麼你可能要修改代碼,例如:

@posts = @user.posts.all + @user.likes.map(&:post)

+0

我覺得這是使用post.inspect方法後的問題,但現在我得到這個錯誤「未定義的方法'職位'爲#<像... ...」使用你的方法(仍然使用post.inspect來檢查它) – Jon

+0

你的'Like'類是什麼樣的? –

+1

很可能@ user.likes.map(&:post)(不是'posts') – Swards

1

我認爲在活動記錄它會快於使用紅寶石地圖

@posts = Post.joins("left join likes on likes.post_id = posts.id"). 
where("posts.user_id ? OR likes.user_id = ?", @user.id, @user.id) 

可能會更好,會在後期模型來定義範圍

scope :owned_or_liked_by, ->(user) { joins("left join likes on likes.post_id = posts.id"). 
where("posts.user_id ? OR likes.user_id = ?", user.id, user.id) } 

然後你就可以使用

@posts = Post.owned_or_liked_by(@user) 

其他解決方案也將工作,但你產生一個SQL查詢,它會更快,當你將有數據的大量量。

+0

編輯,不知道爲什麼我開始考慮照片:) – lis2

+0

是的,會有大量的帖子。所以我會試試這個,因爲我希望它是輕快的 – Jon

+0

太棒了,請讓我知道它是否有效,但仍然有機會我沒有犯錯誤) – lis2

0

這是另一種方法,你可以採取,這是一種將其放入一個查詢中並進行排序。如果你想把它全部包含在一個列表中。

class Post < ActiveRecord::Base 

    def self.visible_to(user) 
    where('posts.user_id = :user_id or likes.user_id = :user_id', { :user_id => user.id}).includes(:likes).order('created_at desc') 
    end 

end 

然後在控制器,你會做

@posts = Post.visible_to(@user) 
+0

這看起來更清潔和更輕,但不是它把這個錯誤「錯誤的參數數量(1爲0)」 – Jon

+0

我刪除了「sort('created_at desc')」,現在它工作。謝謝。一個簡單的問題 - 如果按照他們喜歡的方式排序,而不是創建它們時,是否可行? (例如,帖子是在5天前創建的,我喜歡,現在它顯示在我今天早些時候發佈的帖子前) – Jon

+0

對不起,應該是'訂購'。 'sort'是一個數組方法,而order是用於活動記錄的。由孩子排序有點棘手,有潛在的唯一性問題,但你可以嘗試順序('likes.created_at')。您也可以嘗試使用has_many through方法進行排序。做一個額外的關聯。 has_many:sorted_likes:class_name =>'Like',:order =>'likes.created_at'。然後做has_many:sorted_liked_posts:through =>:sorted_likes,:source =>:post。 – Swards

相關問題