5

多くの人が名前空間について、コントローラーにつながる URL をプレフィックス (/movies ではなく /admin/movies) で変更する方法として話します。

URL パスの変更

公式ドキュメントでは、コントローラーにつながる URL をプレフィックス付きで変更したい場合は、config/route.rb のリソースを変更するだけでよいと説明されています。

これから :

  resources :movies

これに:

  resources :movies, :path => "/admin/movies"

名前空間の実装

多くのグーグル検索の後、ルーターファイル内の特定のコントローラーにつながる URL パスを変更するだけでなく、なぜ多くの人が名前空間を持ちたいのか、名前空間の利点は何なのか疑問に思っています: myapp/config/route.rb

名前空間を実装するには、公式ドキュメントでは、次の変更が必要であると説明しています。これは大変な作業であることがわかります:

  namespace :admin do
    resources :movies
  end

...そして、movies_controller.rb コントローラーを app/controllers/admin ディレクトリに移動します。

ただし、これらの指示に従うと、次のエラーが発生します。

*"/var/www/myapp/app/controllers/admin/movies_controller.rb で Admin::MoviesController を定義する必要があります"*

*その後、Rails は、movies_controller.rb の先頭にこの「エイリアン」の書き込みを期待していることに気付きました: "Admin::"*

したがって、movies_controller.rb の最初の行を次のように変更します。

  class admin::MoviesController < ApplicationController

それ以外の :

  class MoviesController < ApplicationController

しかし、再び別のエラーが発生します: 「main:Object の未定義のローカル変数またはメソッド `admin'」

その後、Ruby クラスは大文字で始まる宣言をしなければならないことを忘れていたことに気付きました。

したがって、Ruby クラスに先頭の大文字を追加します。

  class Admin::MoviesController < ApplicationController

しかし、それでもエラーが発生します:

*欠落しているテンプレート admin/movies/index、application/index {:locale=>[:"fr-CH"]、:formats=>[:html]、:handlers=>[:erb、:builder、:rxls、 :coffee, :haml]}. 検索場所: * "/var/www/myapp/app/views"*

なんてこったい...?ああ、コントローラーの対応するビューも app/view/ 内の管理ディレクトリに移動する必要があるとドキュメントが言うのを忘れていましたか?

したがって、ディレクトリを作成し、ビューを app/view/admin/ に移動しても、同じエラーが発生します。

その後、app/view/admin 内にムービー フォルダー自体を含めるのを忘れていることに気付きました。

それでもエラー メッセージが表示されます: *undefined method `movies_path' for #<#:0xa817c0c>*

今回は、ルーティング、コントローラー、ビューが機能することはわかっていますが、すべてのビューのパスを変更する必要があります...

さらに、コントローラ ファイルで " Respond_with " メソッドを使用している場合は、名前空間をパラメータとして含める必要があります。これはインデックス操作の例です:

  def index
    @movies = Movie.all
    respond_with(:admin, @movies)
  end

さらに、declarative_authentification gem (cancan gem と同様) を使用している場合は、permited_to? の引数の前にプレフィックスを付ける必要があります。名前空間を持つメソッド。例 (HAML 構文を使用):

- if permitted_to? :index, :admin_movies
  // And prefix as well your path
  = link_to 'Show all my movie", admin_movies_path

- if permitted_to? :show, :admin_movies
  // And prefix as well your path
  = link_to 'Show selected movie", admin_movie_path(@movie)

URL パスの利便性のためだけに名前空間を作成しようとしていたことに気付いたので、諦めて modif をロールバックし、次の行を route.rb ファイルに追加することにしました。

  resources :movies, :path => "/admin/movies"

これは魅力のようにすぐに機能します。

テスト目的として、ジェネレーターを使用して名前空間を含む新しい偽のプロジェクト「testapp」を作成しました。「rails generate scaffold admin/movie title:string」を実行して、ジェネレーターが名前空間をどのように処理するかを確認しました。結果の app/controller/admin/movies_controller.rb は、予想していたものとはかなり異なります。各インスタンス変数宣言の前に追加のプレフィックス「Admin::」があります。ここでは、たとえば index メソッド:

  def index
    @admin_movies = Admin::Movie.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @admin_movies }
    end
  end

これは、ジェネレーターもモデル movie.rb を app/models/admin ディレクトリに移動したためだと思います

さらに、 app/models に別のモデルがあることがわかります: admin.rb これには以下が含まれます:

  module Admin
    def self.table_name_prefix
      'admin_'
    end
  end

このメソッドがどのように使用されるのか、誰によって使用されるのかわかりません。

/db/migrate/2012blabla_create_admin_movies.rb で、テーブルの名前が「admin_movies」になることにも気付きました。

  class CreateAdminMovies < ActiveRecord::Migration
    def change
      create_table :admin_movies do |t|

        t.timestamps
      end
    end
  end

名前空間を配置するために、予想よりも多くの作業 (および混乱) が発生するようです...

どのような利益/利点がありますか???

  1. 別の URL パスを使用するには? 私のコントローラーでのこの小さな変更は、はるかに簡単になります: resources :movies, :path => "/admin/movies"
  2. 同じ名前を使用して 2 つの異なるコントローラーを使用できるようにするには? この混乱をすべて行うよりも、コントローラー名にプレフィックスを付ける方が簡単ではないでしょうか?

もちろん、上記のエラーのいくつかは、もっと注意深くなっていれば回避できたはずです。しかし、ご存知のように、私たちはただの人間であり、コーディングをしている夜遅くになると、レールのこの部分がもっと人間に適応していればよかったのにと思うかもしれません...

なぜ人々が名前空間を持つことに興奮するのか、私には本当に理解できません。専門家が私に欠けているものを説明できれば、私は感謝しています.

どうもありがとう

4

2 に答える 2

1

名前が同じで機能が異なる 2 つの異なるコントローラーがある場合は、名前空間付きルートを使用できます。コントローラーの名前を変更する必要はありません。http://guides.rubyonrails.org/routing.htmlで「2.6 Controller Namespaces and Routing」を確認してください。

于 2012-10-03T08:53:22.397 に答える