gpt4 book ai didi

namespaces - 导轨 : Benefit of URL path modification vs Namespace?

转载 作者:行者123 更新时间:2023-12-04 21:20:32 29 4
gpt4 key购买 nike

许多人谈论命名空间是一种更改 URL 的方式,该 URL 指向带有前缀的 Controller (即:/admin/movies 而不是/movies)

更改网址路径

official doc解释说,如果我们想使用前缀更改通向 Controller 的 URL,我们只需要更改 config/route.rb 中的资源。

由此 :

  resources :movies

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

实现命名空间

经过大量的谷歌搜索,我想知道为什么这么多人喜欢有命名空间和 与仅修改通向特定 Controller 的 URL 路径相比,命名空间的优势是什么 在路由器文件中:myapp/config/route.rb

要实现命名空间,官方文档解释说您需要进行以下修改。 你会看到这是很多工作 :
  namespace :admin do
resources :movies
end

...并将您的 movies_controller.rb Controller 移动到 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

但您仍然收到错误消息:

*缺少模板管理/电影/索引,应用程序/索引与 {:locale=>[:"fr-CH"], :formats=>[:html], :handlers=>[:erb, :builder, :rxls, :咖啡,:haml]}。搜索: * "/var/www/myapp/app/views"*

我勒个去...?哦,文档也忘了说 Controller 的相应 View 也必须移动到 app/view/中的 admin 目录吗?

所以你创建一个目录并将你的 View 移动到 app/view/admin/
你仍然得到同样的错误。

然后你意识到你忘了在 app/view/admin 中包含电影文件夹本身
所以你做到了。

您仍然收到一条错误消息:
*未定义#<#:0xa817c0c>的方法`movies_path'*

这次你知道路由、 Controller 和 View 工作但是您仍然必须更改所有 View 的路径...

此外,如果您在 Controller 文件中使用“ respond_with ”方法,则必须包含命名空间作为参数。这是索引操作的示例:
  def index
@movies = Movie.all
respond_with(:admin, @movies)
end

此外,如果您使用的是 declarative_authentication 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::”。
例如这里的索引方法:
  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

好吧,为了建立一个命名空间,似乎会有比我预期的更多的工作(和困惑)......

有什么好处/优势???
  • 要使用另一个 url 路径?我的 Controller 中的这个小修改
    会容易得多:资源:电影,:路径=>
    "/admin/movies"
  • 为了可以使用相同名称的两个不同的 Controller ?为我的 Controller 名称添加前缀不是比做所有这些困惑更容易吗?

  • 当然,上述一些错误本可以通过提高警惕来避免。但是你知道,我们只是人类,当编码的时候到了深夜,也许你希望这部分 Rails 本来可以,比方说,更加人性化……

    我真的不明白为什么人们对拥有命名空间如此兴奋。
    如果专家能解释我遗漏了什么,我将不胜感激。

    非常感谢

    最佳答案

    如果您有两个名称相同但功能不同的不同 Controller ,则可以使用命名空间路由。您不必为它重命名 Controller 。在 http://guides.rubyonrails.org/routing.html 查看“2.6 Controller 命名空间和路由” .

    关于namespaces - 导轨 : Benefit of URL path modification vs Namespace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12664908/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com