2

私はレールにかなり慣れていないので、この問題に数時間悩まされています。ユーザーが気に入った投稿とユーザーの実際の投稿を表示しようとしています。

現在のコードでは、「 # のメソッド `title' が未定義です」というエラーが表示され、「<%= 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, post %> 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

「undefined method `title'」というメッセージが表示されます..

4

4 に答える 4

2

ユーザーモデルに何かを追加したいかもしれません...

class User < ActiveRecord::Base

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

  ...

end

次に、コントローラーでこれを行うことができます

@posts = @user.posts + @user.liked_posts 
于 2013-05-19T04:10:00.380 に答える
1

アクティブレコードでは ruby​​ map より高速になると思います

@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)

他のソリューションも機能しますが、それは 1 つの SQL クエリを生成し、大量のデータがある場合は高速になります。

于 2013-05-19T04:07:37.047 に答える
0

関連する Array または ActiveRelation@user.likes@を返さないようです。Post

Likeオブジェクトに属性があると想定している場合はpost_id、コードを次のように変更することをお勧めします。

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

于 2013-05-19T04:01:18.020 に答える
0

これは、1 つのクエリに入れ、場合によっては並べ替えることができる別のアプローチです。すべてを 1 つのリストに含めたい場合。

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)
于 2013-05-19T04:46:36.693 に答える