почему мои маршруты дают мне неправильное направление - PullRequest
0 голосов
/ 05 июля 2019

У меня есть связь между пользователем, магазином и предметом, как это:

user has one store
store has many items
item belongs to store    

Поэтому, когда я создаю предмет, он должен принадлежать магазину текущего пользователя

Теперь я вошел как user_1, я хочу найти элемент user_2. Но если я не создал магазин user_1, он продолжал перенаправлять меня на localhost: 3000 / stores

в items_controller.rb:

class ItemsController < ApplicationController
before_action :find_item, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, only: [:new, :edit]
def index
    if params[:category].blank?
        @items = Item.all.order("created_at DESC")
    end    

    if params[:category]

        @category_id = Category.find_by(name: params[:category]).id

        @items = Item.where(category_id: @category_id).order("created_at DESC")
    end


end

def show
end

def new
    @store = current_user.store
    @item = @store.items.build
    @categories = Category.all.map{ |c| [c.name, c.id] } 
end

def update
     @item.category_id = params[:category_id]
    if @item.update(item_params)
        redirect_to item_path(@item)
    else 
        render 'edit'
    end
end

def create
    @store = current_user.store 
    @item = @store.items.build(item_params)
    @item.category_id = params[:category_id]
    if @item.save
       flash[:success] = "Creating item success"
       redirect_to @item    
    else
        render 'new'
    end
end

private

def item_params
    params.require(:item).permit(:code, :name, :description, :producer,  :item_img, :store_id,
    :category_id  )
end

def find_item
    @item = Item.find(params[:id])
end

def find_user
    @user = User.find_by(params[:user_id]) 
end

end

в stores_controller.rb:

class StoresController < ApplicationController
before_action :find_store, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!
before_action :find_user

def show         

    if current_user.store.blank?
        redirect_to new
    else
        @items = Item.where(store_id: @store.id)   
    end               
end

def index    
    @stores = Store.all.order("created at DESC")    
end

def new
    @store = current_user.build_store
end

def create 
    @store = current_user.build_store(store_params)
    if @store.save
        session[:store_id] = @store.id
       flash[:success] = "Creating item success"
       redirect_to @store, notice: 'success'
    else
        render 'new'
    end
end

private 



def store_params
    params.require(:store).permit( :name , :user_id)
end

def find_store
    @store = Store.find(params[:id])
end

def find_user
    @user = Store.find_by(params[:user_id])
end

end

Ошибка возникает при каждом нажатии кнопки в items / show.html.erb. В items / show.html.erb:

<button>see more item from:<%= link_to @item.store.name, store_path(@item.store.id)%></button> 

в маршрутах. Rb:

devise_for :users
resources :items
resources :stores

В методе show для store_controller я по-прежнему хочу загрузить хранилище current_user в разделе navbar, чтобы он мог добавить дополнительные элементы в свое хранилище при входе в систему.

Я все еще новичок в рельсах, и я ищу решения для решения этой проблемы: -)

1 Ответ

1 голос
/ 05 июля 2019

Если для магазина требуется user_id, тогда вам не нужно before_action :find_user, потому что вы можете получить пользователя магазина, просто позвонив store.user

Похоже, вам требуется current_user, чтобы иметь магазин, но что, если они не вошли в систему? Разве это не должно быть?

def show         
  if current_user && current_user.store.blank?
    redirect_to new
  else
    @items = Item.where(store_id: @store.id)   
  end               
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...