0

地区を表示、編集、削除、または追加しようとすると、次のエラーが発生します。

undefined method `state_path' for #<#<Class:0x007f93a9e9df88>:0x007f93af11f8d8>

私はcountry_state_pathリンクを生成することを期待していますlink_to 'Back', [@country, @state]が、何らかの理由でstate_pathしか提供していません。@country.state を実行する代わりにドット表記を使用すると、nilClass エラーが発生します。

モデルにツリー構造を使用しています:

Country
    State
        District

country_state_path と入力すると、すべて正常に動作します。しかし、それは私の状態モデルで機能するため、モデル表記法を使用して入力したいと思います。

(私は正しい用語を使用していますか?間違っている場合は修正してください。私はまだRailsに慣れていません)

コード

地区モデル

class District < ActiveRecord::Base
    validates_uniqueness_of :name, scope: :state_id
    before_destroy :check_for_schools

    belongs_to :state
    #has_many :schools, :order => 'name'

    private
    def check_for_schools
=begin
        if schools.count > 0
            self.errors[:base] << "Cannot delete district while schools exist."
            return false
        end
=end
    end
end

地区コントローラー

class DistrictsController < ApplicationController
  # Allows JSON Queries
  skip_before_filter :verify_authenticity_token
  before_action :set_district, only: [:show, :edit, :update, :destroy]
  before_filter :load_state

  # GET /districts
  # GET /districts.json
  def index
    @districts = @state.districts.all(:order => 'name ASC')
  end

  # GET /districts/1
  # GET /districts/1.json
  def show
  end

  # GET /districts/new
  def new
    @district = @state.districts.new
  end

  # GET /districts/1/edit
  def edit
    @state.districts.find(params[:id])
  end

  # POST /districts
  # POST /districts.json
  def create
    @district = @state.districts.new(district_params)

    respond_to do |format|
      if @district.save
        format.html { redirect_to [@country,@state,@district], notice: 'District was successfully created.' }
        format.json { render action: 'show', status: :created, location: @district }
      else
        format.html { render action: 'new' }
        format.json { render json: @district.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /districts/1
  # PATCH/PUT /districts/1.json
  def update
    respond_to do |format|
      if @district.update(district_params)
        format.html { redirect_to [@state, @district], notice: 'District was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @district.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /districts/1
  # DELETE /districts/1.json
  def destroy
    @district = @state.district.find(params[:id])
    respond_to do |format|
      if @district.destroy
        format.html { redirect_to @state }
        format.json { head :no_content }
      else
          format.html { redirect_to( @state, :notice => 'Unable to delete a state that has districts.') }
          format.json { render json: @district.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_district
      @district = District.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def district_params
      params.require(:district).permit(:name, :state_id)
    end

    def load_state
      @state = State.find(params[:state_id])
    end
end

地区「ショー」ビュー

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @district.name %>
</p>

<p>
  <strong>State:</strong>
  <%= @district.state_id %>
</p>

<%= link_to 'Edit', edit_country_state_district_path(@country, @state, @district) %> |
<%= link_to 'Back', [@country, @state] %>

機能していない行は"link_to 'Back', [@country, @state].

4

2 に答える 2

0

したがって、ルートを次のように構成する必要があります。

NetworkManager::Application.routes.draw do

    root to: "countries#index"

    resources :countries do
        resources
    end

    resources :states do
        resources :districts
    end

end

それ以外の:

NetworkManager::Application.routes.draw do

    root to: "countries#index"

    resources :countries do
        resources :states do
            resources :districts
        end
    end

end

だから、これが私の最終目標です。これを行うためのより良い方法があるかもしれません...

私たちは全国に学校を設置しており、各学校にはさまざまなネットワーク デバイスがあります。これの本当の目的は、各学校のネットワーク情報を追跡することですが、国 -> 州 -> 地区 -> 学校 -> ネットワーク -> デバイスに整理できるようにしたいと考えています。

やりたいならやった方がいいと思う

Countries
    States

States
    Districts

Districts
    Schools

Schools
    Networks

Networks
    Devices

情報を入力する人が、このデバイスがこの A 学校に関連付けられていることを簡単に判断できるようにしたい。また、別の学校に移動する必要がある場合に備えて、デバイスを学区に簡単に接続できるようにすることもできます。

于 2013-07-01T06:14:22.230 に答える
0

@country は nil であるため、show/edit/destroy メソッドで @country を手動で設定する必要があります。

ただし、メモ。一般に、ネストは 2 つだけにするのがベスト プラクティスです。そう:

Country
  State

State
  District

知っている。知っている。メッセンジャーを撃たないでください。情報を流しているだけです。

于 2013-07-01T06:00:19.703 に答える