0

Добрый день StackOverflow,ActionController :: UrlGenerationError с: админ имен и вложенных ресурсов

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

# routes.rb 

namespace :admin do 

    resouurces :clients do 
    resources :sites 
    end 

end 

Я бегу в следующее сообщение об ошибке при попытке перейти от «сайта» шоу-страницы на сайте «редактировать» страницы:

ActionController::UrlGenerationError at /admin/clients/9A81622C/sites/88AA/edit 

, а затем BetterErrors дает мне это ниже сообщение об ошибке:

No route matches {:action=>"show", :client_id=>nil, :controller=>"admin/clients/sites", :id=>"88AA"} missing required keys: [:client_id] 

выходной рейк маршруты для admin_client_site выглядит следующим образом:

 admin_client_sites POST /admin/clients/:client_id/sites(.:format)   admin/clients/sites#create 
    new_admin_client_site GET /admin/clients/:client_id/sites/new(.:format)  admin/clients/sites#new 
edit_admin_client_site GET /admin/clients/:client_id/sites/:id/edit(.:format) admin/clients/sites#edit 
     admin_client_site GET /admin/clients/:client_id/sites/:id(.:format)  admin/clients/sites#show 
         PATCH /admin/clients/:client_id/sites/:id(.:format)  admin/clients/sites#update 
         PUT /admin/clients/:client_id/sites/:id(.:format)  admin/clients/sites#update 
         DELETE /admin/clients/:client_id/sites/:id(.:format)  admin/clients/sites#destroy 

ссылка редактирования на «шоу-страницы» в настоящее время следующим образом, и это где проблема (или я так считаю):

<%= link_to "Edit", edit_admin_client_site_path(@client, @site) %> 

form_for для клиента сайтов является:

<%= form_for [:admin, @client, @site], :url => admin_client_sites_url do |f| %> 

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

EDIT # 1 - Добавляет клиента и сайта Модели

Client.rb 
class Client < ActiveRecord::Base 
    before_create :generate_client_ident 

    # Model Relations 
    has_many :sites, dependent: :destroy 

    # Model Validations 
    validates_uniqueness_of :client_ident 

    # Unique Admin Identifier 
    def generate_client_ident 
     begin 
     self.client_ident = SecureRandom.hex(4).upcase 
     other_client = Client.find_by(client_ident: self.client_ident) 
     end while other_client 
    end 

    # Vanity URL 
    def to_param 
     client_ident 
    end 
end 


Site.rb 
class Site < ActiveRecord::Base 
    before_create :generate_site_ident 

    # Model Relations 
    belongs_to :client 

    # Model Validations 
    validates_uniqueness_of :site_ident 

    # Unique Admin Identifier 
    def generate_site_ident 
    begin 
     self.site_ident = SecureRandom.hex(2).upcase 
     other_site = Site.find_by(site_ident: self.site_ident) 
    end while other_site 
    end 

    # Vanity URL 
    def to_param 
    site_ident 
    end 

end 

EDIT # 2 - Добавляет контроллеры

class Admin::Clients::SitesController < ApplicationController 
    before_action :authenticate_admin_admin! 
    before_action :set_site, only: [:show, :edit, :update, :destroy] 

    # GET /sites 
    # GET /sites.json 
    def index 
    @sites = Site.all 
    end 

    # GET /sites/1 
    # GET /sites/1.json 
    def show 
    @client = Client.find_by_client_ident(params[:id]) 
    end 

    # GET /sites/new 
    def new 
    @client = Client.find_by_client_ident(params[:id]) 
    @site = Site.new 
    end 

    # GET /sites/1/edit 
    def edit 
    @client = Client.find_by_client_ident(params[:id]) 
    end 

    # POST /sites 
    # POST /sites.json 
    def create 
    @client = Client.find_by_client_ident(params[:id]) 
    @site = Site.new(site_params) 
    @site.client = @client 

    respond_to do |format| 
     if @site.save 
     format.html { redirect_to admin_clients_url, notice: 'Site was successfully created.' } 
     format.json { render :show, status: :created, location: [:admin, @client] } 
     else 
     format.html { render :new } 
     format.json { render json: @site.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /sites/1 
    # PATCH/PUT /sites/1.json 
    def update 
    respond_to do |format| 
     if @site.update(site_params) 
     format.html { redirect_to [:admin, @client], notice: 'Site was successfully updated.' } 
     format.json { render :show, status: :ok, location: [:admin, @client] } 
     else 
     format.html { render :edit } 
     format.json { render json: @site.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /sites/1 
    # DELETE /sites/1.json 
    def destroy 
    @site.destroy 
    respond_to do |format| 
     format.html { redirect_to sites_url, notice: 'Site was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_site 
     @site = Site.find_by_site_ident(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def site_params 
     params.require(:site).permit(:client_id, :site_ident) 
    end 
end 

class Admin::ClientsController < ApplicationController 
    before_action :authenticate_admin_admin! 
    before_action :set_client, only: [:show, :edit, :update, :destroy] 

    # GET /clients 
    # GET /clients.json 
    def index 
    @clients = Client.all 
    end 

    # GET /clients/1 
    # GET /clients/1.json 
    def show 
    @client = Client.find_by_client_ident(params[:id]) 
    @site = @client.sites 
    end 

    # GET /clients/new 
    def new 
    @client = Client.new 
    end 

    # GET /clients/1/edit 
    def edit 
    end 

    # POST /clients 
    # POST /clients.json 
    def create 
    @client = Client.new(client_params) 

    respond_to do |format| 
     if @client.save 
     format.html { redirect_to [:admin, @client], notice: 'Client was successfully created.' } 
     format.json { render :show, status: :created, location: @client } 
     else 
     format.html { render :new } 
     format.json { render json: @client.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /clients/1 
    # PATCH/PUT /clients/1.json 
    def update 
    respond_to do |format| 
     if @client.update(client_params) 
     format.html { redirect_to [:admin, @client], notice: 'Client was successfully updated.' } 
     format.json { render :show, status: :ok, location: @client } 
     else 
     format.html { render :edit } 
     format.json { render json: @client.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /clients/1 
    # DELETE /clients/1.json 
    def destroy 
    @client.destroy 
    respond_to do |format| 
     format.html { redirect_to [:admin, @client], notice: 'Client was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_client 
     @client = Client.find_by_client_ident(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def client_params 
     params.fetch(:client, {}).permit(:client_ident, :client_name, :street_number, :street_name, :unit_apt, :grid, :city, 
          :province, :postal_code, :office_tel, :office_ext, :cell_tel, :fax, :contact_email, :same_as_above, 
          :bill_to_client_name, :bill_to_street_number, :bill_to_street_name, :bill_to_grid, :bill_to_city, 
          :bill_to_province, :bill_to_postal_code) 
    end 
end 

EDIT # 3 Добавляет ScreenShot ошибки enter image description here

EDIT # 4 - Добавляет журнал сервера Rails при нажатии ссылки «Изменить» на странице «Страница сайта»

Started GET "/admin/clients/9A81622C/sites/88AA" for ::1 at 2016-05-25 14:10:51 -0600 
Processing by Admin::Clients::SitesController#show as HTML 
    Parameters: {"client_id"=>"9A81622C", "id"=>"88AA"} 
    Admin Load (0.4ms) SELECT "admins".* FROM "admins" WHERE "admins"."id" = $1 ORDER BY "admins"."id" ASC LIMIT 1 [["id", 1]] 
    Site Load (0.2ms) SELECT "sites".* FROM "sites" WHERE "sites"."site_ident" = $1 LIMIT 1 [["site_ident", "88AA"]] 
    Client Load (0.2ms) SELECT "clients".* FROM "clients" WHERE "clients"."id" = $1 LIMIT 1 [["id", 9]] 
    Rendered admin/clients/sites/show.html.erb within layouts/application (3.4ms) 
Completed 500 Internal Server Error in 12ms (ActiveRecord: 0.8ms) 
+0

Показать, что в вашем администратора :: SitesController. Убедитесь, что в действии редактирования вы правильно назначили @ client variable. Ошибка говорит о том, что @ клиент равен нулю, поэтому файл edit_admin_client_site_path не может быть сгенерирован, потому что @ сайт должен относиться к клиенту @ и не может относиться к клиенту nil, очевидно. – Alex

+0

Ive Добавлено контроллеров. Похоже, я добавил переменную там, где она должна быть. –

+0

Мое предложение - глубже вдаваться в отладку. Проверьте, что значение @ client в действии show. Проверьте, какие рельсы канала генерируются. Проверьте, входит ли запрос в действие редактирования. – Alex

ответ

0

Похоже, проблема может быть в вашем контроллере Sites. Просматривая, как вы пытаетесь установить @client я вижу, что у вас есть это как: @client = Client.find_by_client_ident(params[:id])

Но на этом уровне в гнездовой params[:id] будет ссылки на идентификатор сайта, а не клиента. Не зная, как именно вы используете/хранение client_ident против фактического id клиента я бы ожидал увидеть следующее вместо:

@client = Client.find_by_id(params[:client_id])

Это происходит потому, что в маршрутах у вас есть настройки пути для .../clients/:client_id/sites/:site_id поэтому :client_id - это то, что будет проходить. В этом случае, когда вы пытаетесь найти клиента в контроллере сайтов, вы передаете идентификатор сайта как параметр, а не client_id.

Если ваш client_ident!= client.id, тогда я бы не пытался использовать params[:id], чтобы искать/загружать записи по Client.find_by_client_ident, поскольку они не должны совпадать (если, как я уже сказал, я не вижу чего-то в том, как вы реализуете client_ident).

Дайте нам знать ваши мысли, и если это изменение работает для вас :)

+0

Клиент-клиент - это просто тщеславие/замена обычного ID: 1,2,3 ect .. но я хочу, чтобы они помещались в URL-адресе, чтобы затруднить кому-то прыгать, что может получить доступ к приложению. –

+0

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

+0

@ShawnWilson Когда вы внесли изменения, что вы изменили действие 'sites # show'? Можете ли вы использовать 'byebug' или' binding.pry' (в зависимости от того, что вы могли бы использовать) в действие 'sites # show' и посмотреть, какое значение имеет значение @client в этой точке? – marginalchaos

 Смежные вопросы

  • Нет связанных вопросов^_^