Не найдено ни одного маршрута {: action => «show»,: controller => «shops»,: id => nil}, отсутствуют обязательные ключи: [: id] - PullRequest
0 голосов
/ 30 июня 2019

Я создаю приложение для электронной коммерции, где каждый пользователь может создать свой собственный магазин.Связь между пользователем и магазином должна быть

user has_one shop
shop belongs_to user

И до сих пор пользователь, создавший магазин, работает отлично.Но для тех, кто этого не сделал, он показывает мне ошибку:

No route matches {:action=>"show", :controller=>"shops", :id=>nil},  missing required keys: [:id]

По моему shops_controller.rb

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

  def show
    if current_user.shop.blank?
        render 'new'
    else
        @items = Item.where(shop_id: @shop.id)   
    end
  end

  def index    
    @shops = Shop.all.order("created at DESC")    
  end

  def new
    @shop = current_user.build_shop
  end

  def create 
    @shop = current_user.build_shop(shop_params)
    if @shop.save
        session[:shop_id] = @shop.id
       flash[:success] = "Creating item success"
       redirect_to @shop, notice: 'success'
    else
        render 'new'
    end
  end

private 

  def shop_params
    params.require(:shop).permit( :name , :user_id)
  end

  def find_store
    @shop = Shop.find(params[:id])
  end

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

По application.html.erb

 <% if user_signed_in?%>
   <%= link_to "profile", user_path(current_user.id) %>
   <% if current_user.shop == nil %>
     <li><%= link_to "Your shop", new_shop_path %></li>
   <% else %>
     <li><%= link_to "Your shop", shop_path(current_user.shop.id)%></li>    
   <% end %>   
 <% end %>

current_user генерируется автоматически с помощью gem 'devise.

Ошибка произошла, когда я нажал "Ваш магазин", и ошибка произошла только с пользователем, который не создает свой магазин

в rout.rb:

devise_for :users
root 'static_pages#home'
as :user do
  get "signin" => "devise/sessions#new"
  post "signin" => "devise/sessions#create"
  delete "signout" => "devise/sessions#destroy"
end
resources :shops

В этой строке возникла ошибка:

<li><%= link_to "Your Shop",shop_path(current_user.shop.id)%></li>

Я ищу решения для решения этой проблемы: -)

Ответы [ 2 ]

3 голосов
/ 30 июня 2019

Когда вы переходите к new_shop_path ваше действие контроллера new, кажется, создает пользовательский магазин:

@shop = current_user.build_shop

Итак, отсюда current_user.shop != nil

Но так как оно не сохраняется вв этот момент у этого магазина нет id.Таким образом, по вашему мнению, он входит в else, поскольку shop не равен nil, но тогда нет id, и возникает ошибка.

<% if current_user.shop == nil %>
  <li><%= link_to "Your shop", new_shop_path %></li>
<% else %>
  <li><%= link_to "Your shop", shop_path(current_user.shop.id)%></li>    
<% end %>   

изменить на:

<% if !current_user.shop || !current_user.shop.id %>
  <li><%= link_to "Your shop", new_shop_path %></li>
<% else %>
  <li><%= link_to "Your shop", shop_path(current_user.shop.id)%></li>    
<% end %>   
2 голосов
/ 30 июня 2019

Я думаю, что вы хотите перенаправить вместо рендера, а также убедиться, что магазин сохранен в базе данных.

def show
  if current_user.shop&.persisted?
    redirect_to :new
  else
    @items = Item.where(shop_id: @shop.id)   
  end
end

Также, на ваш взгляд, вы можете сделать это с помощью безопасной навигации и использовать .persisted?, так как вы заботитесьбольше об этом shop.id и эта логика имеет больше смысла, чем наоборот.

<% if current_user.shop&.persisted? %>
  <li><%= link_to "Your shop", shop_path(current_user.shop.id)%></li>
<% else %>
  <li><%= link_to "Your shop", new_shop_path %></li>
<% end %> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...