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
过滤器。这就是 @user
是 nil
的原因。请添加它:
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
我有想要在产品视图中 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
过滤器。这就是 @user
是 nil
的原因。请添加它:
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