Search code examples
ruby-on-railsfriendly-id

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


I have user information I want to post in the products view. How do I do this?

undefined method 'avatar' for nil:NilClass

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

I have Post, Product, User Model and controllers

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

Any help would be appreciated. I basically want to create a link but there is an issue as I'm not sure how to connect these controller and models.


Solution

  • It seems, you are rendering posts/new.html.erb. But you have not added :new action to the before_action filter. That's why @user is nil. Do add it :

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