0

良い一日のStackOverflow、ActionController :: UrlGenerationErrorが付きます。admin名前空間とネストされたリソース

私は管理者の名前空間を作成している、と名前空間の中に、私はクライアントのリソースを持っており、その中でネストされたが、そのようなサイトのリソースです:

# 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の#エラー enter image description here

EDIT#4の3追加スクリーンショットを追加します - 「サイト表示ページ」の編集リンクをクリックすると、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

あなたのAdmin :: SitesControllerには何が表示されますか?編集アクションで、@ client変数を適切に割り当てるかどうかを確認してください。 @ clientがnilなので、edit_admin_client_site_pathは生成できません。なぜなら、@ siteは@clientに関連していなければならず、明らかにnilクライアントに関連付けることができないからです。 – Alex

+0

Iveコントローラを追加しました。必要な場所に変数を追加したようです。 –

+0

私の提案は、デバッグに深く関わることです。 showアクションで@clientの値を確認してください。レールが生成するリンクを確認してください。リクエストが編集操作に入るかどうかを確認します。 – Alex

答えて

0

コントローラのSitesに問題があるようです。あなたは私のようにあなたがそれを持っていることを確認@client設定しようとしているかを見ているでは:ネスティングparams[:id]@client = Client.find_by_client_ident(params[:id])

しかし、このレベルでは、クライアントのサイトのIDを参照しないことになります。あなたのルートでご.../clients/:client_id/sites/:site_idのパスを設定しているためです

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

:あなたは、私が代わりに次のを見て期待したクライアントの実際のidclient_identを保存する/使用しているかを正確に知っていません:client_idが渡されます。この場合、サイトコントローラでクライアントを表示しようとすると、client_idではなくパラメータとしてサイトのIDが渡されます。

client_ident!= client.id次に、params[:id]を使用して、Client.find_by_client_identでレコードをロード/ロードするのは避けたいと思います(私が言ったように、client_identを実装する方法に何か不足している場合を除きます)。

あなたの考えを知って、その変更がうまくいくかどうかお知らせください。

+0

client_identはid:1,2,3 ectの通常のための本質的なちょうど虚栄/置き換えです。しかし、私はこれらをURLに置いて、誰かが飛び回ってアプリにアクセスできるようにすることをより困難にします。 –

+0

私はあなたの修正を念入りにしようとしましたが、同じエラーを受けていますが、元のエラーは変更されていません。 –

+0

@ShawnWilson 変更を加えたら、 'sites#show'アクションを何に変更しましたか? 'byebug'や' binding.pry'(あなたが使っているかもしれないもの)を 'sites#show'アクションに投げて、その時点で@clientの値が何であるか見ることができますか? – marginalchaos

関連する問題