Rails:如何在视图中呈现或 post 信息?用户信息,用于产品视图

Rails: How do I render or post information in view? User Info, used in Products View

我有想要在产品视图中 post 的用户信息。我该怎么做呢?

undefined method 'avatar' for nil:NilClass

 <%= image_tag(@user.avatar.url(:thumb)) %>
 <%= link_to @post.user.name, @post.user %>

我有 Post、产品、用户模型和控制器

PostsController.rb

class PostsController < ApplicationController
      before_action :find_post, only: [:show, :edit, :update, :destroy]
      before_action :authenticate_user!, except: [:index, :show]

def index
    if 
        params[:category].blank?
        @posts = Post.all.order("created_at DESC").paginate(page:params[:page], per_page: 6 )
    else
        @category_id = Category.all 
        @category_id = Category.find_by(name: params[:category]).id
        @posts = Post.where(category_id: @category_id).order("created_at DESC").paginate(page:params[:page], per_page: 6 )
    end
end

def show  
    @user = User.find_by id: @post.user_id
end

def new
    @post = current_user.posts.build
end

def create
    @post = current_user.posts.build(post_params)

    if @post.save
        redirect_to @post
    else
        render 'new'
    end
end

def update
    if @post.update(post_params)
        redirect_to @post
    else
        render 'edit'
    end
end

def edit
end

def destroy
    @post.destroy
    redirect_to root_path, notice: "The post was deleted"
end


private

def find_post
    @post = Post.find(params[:id])
end

def post_params
    params.require(:post).permit(:title)
end

end

UsersController.rb

class UsersController < ApplicationController
   before_action :authenticate_user!
   before_action :set_user

def index
    @users = User.all
  end

def edit
    @user = User.create( user_params )
end

  def show
     @user = User.friendly.find(params[:id])
     @product = current_user.products.where(availability: true).order("created_at DESC")
     @purchased = Sale.where(buyer_email: current_user.email).order("created_at DESC")
     @sales = Sale.where(seller_email: current_user.email).order("created_at DESC")
     @products = current_user.products
end

def profile
    @products = current_user.products
end

private

def user_params
    params.require(:user).permit(:name, :email, :avatar, :id)
end

def set_user
    @user = User.friendly.find(params[:id])
end

end

如有任何帮助,我们将不胜感激。我基本上想创建一个 link 但有一个问题,因为我不确定如何连接这些控制器和模型。

看来,你正在渲染posts/new.html.erb。但是您还没有将 :new 操作添加到 before_action 过滤器。这就是 @usernil 的原因。请添加它:

class PostsController < ApplicationController
      before_action :find_post, only: [:show, :edit, :update, :destroy, :new ]

undefined method 'avatar' for nil:NilClass提示页面加载时@user为nil,所以页面加载失败在这一行:<%= image_tag(@user.avatar.url(:thumb)) %>

要么 id 参数为空,要么它因某种原因无效(例如,没有用户使用该 ID),以至于 @user = User.friendly.find(params[:id]) 找不到任何东西。

User.friendly.find 中调用的库 FriendlyId 似乎没有正确配置以解析该调用。同时,您可以使用您在帖子控制器中使用的相同方法来填充 @user@user = User.find_by id: @post.user_id