我有一个命名空间的模型和控制器:

# app/controllers/foo_stuff/bars_controller.rb
module FooStuff
  class BarsController < ApplicationController
    # ..
  end
end

# app/models/foo_stuff/bar.rb
module FooStuff
  class Bar < ApplicationRecord
    # ...
  end
end

我想:

  • URL看起来像/foo/1,这将路由到FooStuff::BarController#show.
  • 命名的路由帮助器看起来像foo_url,例如foo_url(@bar).

我的路由是这样设置的:

# config/routes.rb
scope module: 'foo_stuff', as: 'foo' do
  resources :bars, path: 'foo'
end

当我运行rails routes时,这看起来是正确的.

然而,当我try 的时候:

<%= link_to('Something', @bar) %>

...Rils抱怨undefined method 'foo_stuff_bar_url' for an instance of #<Class:...>个.

如果我显式地使用命名路由,这是可以的:

<%= link_to('Something', foo_url(@bar) %>

我希望link_to()能从路由中找出@bar模型调用的路由助手. 但事实并非如此.

我是不是遗漏了什么?

推荐答案

模型映射到路径的方式基本上是这样的:

send("#{FooStuff::Bar.model_name.route_key}_path")

您可以更改特定模型路由的解析方式,也可以更改其polymorhpic url映射,使用resolve:

# config/routes.rb

Rails.application.routes.draw do
  scope module: "foo_stuff", as: "foo" do
    resources :bars, path: "foo"
  end

  resolve "FooStuff::Bar" do |bar|
    if bar.persisted?
      [:foo_bar, id: bar.id]
    else
      [:foo_bars]
    end
  end
end
<%= link_to nil, FooStuff::Bar.first %>
#=> <a href="/foo/1">/foo/1</a>

<%= link_to nil, FooStuff::Bar.new %>
#=> <a href="/foo">/foo</a>

然而,resolve并不是万能的:

<%= link_to nil, [:edit, FooStuff::Bar.first] %>
#=> undefined method `edit_foo_stuff_bar_path'

你也可以用direct来"解决"这个问题,这更像是给正确的路由取了个别名:

# config/routes.rb

Rails.application.routes.draw do
  # ...

  direct :edit_foo_stuff_bar do |bar|
    [:edit, :foo_bar, id: bar.id]
  end
end
<%= link_to nil, [:edit, FooStuff::Bar.first] %>
#=> <a href="/foo/1/edit">/foo/1/edit</a>

最后,您可以更改路由密钥,任何副作用都会影响到您:

FooStuff::Bar.model_name.route_key = "foo_bars"
FooStuff::Bar.model_name.singular_route_key = "foo_bar"
<%= link_to nil, FooStuff::Bar.first %>          #=> <a href="/foo/1">/foo/1</a>
<%= link_to nil, FooStuff::Bar.new %>            #=> <a href="/foo">/foo</a>
<%= link_to nil, [:edit, FooStuff::Bar.first] %> #=> <a href="/foo/1/edit">/foo/1/edit</a>

Ruby-on-rails相关问答推荐

Rails 7.1解决冲突的Zeitwerk Inflection规则

form_with正在try 用错误的路径生成操作

Rails turbo流只更新页面上的一个元素

Ruby:如何通过谓词将一个集合拆分为 ruby​​ 中的两个集合?

NoMethodError:Puma::Events:Class 的未定义方法字符串

向现有控制器添加操作(Ruby on Rails)

Rails 是否带有未授权异常?

在 Rails 的 ActiveRecord 中,touch 有什么用?

rails 3 - link_to 销毁不工作

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

在 Rails 4 中检测用户代理 - 读取 HTTP 标头

rails 4.0, rake db:sessions:create

设计和强大的参数

带有查询字符串参数的 Rails 动作缓存

Rails 文章助手 - a 或 an

删除链接在 Rails 3 视图中发送Get而不是Delete

通过 Ruby 或 Rails 的 LDAP

Sidekiq 在 docker-compose 上的 127.0.0.1:6379 (Errno::ECONNREFUSED) 上连接到 Redis 时出错

如何强制 RSpec 测试失败?

ActiveModel::MissingAttributeError:无法使用 FactoryGirl 写入未知属性ad_id