加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 命名空间API和资源路由

发布时间:2020-12-17 01:29:42 所属栏目:百科 来源:网络整理
导读:我在版本化命名空间中有我的API, namespace :api do namespace :v1 do resources :posts endend 但是现在当我让我的控制器执行redirect_to @post时,我得到Post的路由错误,因为没有为它定义路由. def create @post = Post.new(params[:post]) if @post.save r
我在版本化命名空间中有我的API,

namespace :api do
  namespace :v1 do
    resources :posts
  end
end

但是现在当我让我的控制器执行redirect_to @post时,我得到Post的路由错误,因为没有为它定义路由.

def create
  @post = Post.new(params[:post])
  if @post.save
    redirect_to @post
  else
    # ...
  end
end

undefined method `post_url' for #<Api::V1::PostsController:0x007fb9c5fc8858>

我知道我可以更新我的控制器以重定向到指定的路由,而不是世界末日:

def create
  @post = Post.new(params[:post])
  if @post.save
    redirect_to api_v1_post_url(@post)
    # or redirect_to [:api,:v1,@post]
  else
    # ...
  end
end

有没有办法让redirect_to @post自动检测到它应该在正确的api版本中(因此rails可以使用api_v1_post_url)?我知道我可以覆盖redirect_to,但实际上我想要一个名称空间感知url_for,也许rails为此提供了一些钩子?

解决方法

Ruby on Rails路由器有三个选项

命名空间(你现在正在使用的东西)

namespace :api do
  namespace :v1 do
    resources :posts
  end
end

控制器:app / controllers / api / v1 / PostsController.rb

示例URL路径:example.com/api/v1/posts

范围(仅设置网址路径)

scope 'api/v1' do
 resources :posts
end

控制器:app / controllers / PostsController.rb

示例URL路径:example.com/api/v1/posts

模块(仅设置控制器)

scope module: 'api/v1' do
   resources :posts
 end

控制器:app / controllers / api / v1 / PostsController.rb

示例URL路径:example.com/posts

正如您可能从上面看到的那样,三个人都做了类似于你想要的事情而不是你想要的事情.

我可以想到的唯一的解决方法是使用笨拙的长路径助手api_v1_post_url是使用命名路由来缩短它.

namespace :api,:as => "a" do
  namespace :v1,:as => "1" do
    resources :posts
  end
end

而不是api_v1_post_url

def create
  @post = Post.new(params[:post])
  if @post.save
    redirect_to api_v1_post_url(@post)
  end
end

你可以使用更短的a_1_post_url

def create
  @post = Post.new(params[:post])
  if @post.save
    redirect_to a_1_post_url(@post)
  end
end

最后,我担心,我不知道有任何方法可以智能地自动检测rails路由中的命名空间.

希望能帮助到你

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读