命名空间路由和模型路径轨

Gui*_*ois 1 ruby routing namespaces module ruby-on-rails

我刚刚开始使用rails,直到现在我对它非常满意,但有一点我无法弄清楚.

我在命名空间"Monitor"中有一些ActiveRecords模型,我在命名空间"设置"中有一些控制器.我想要完成的是我可以在我的设置控制器/表单中使用命名空间模型.

我有这个:

/config/routes.rb

namespace :settings do
  resources :queues, :channels
end
Run Code Online (Sandbox Code Playgroud)

/app/controllers/settings/queus_controller.rb

class Settings::QueuesController < ApplicationController

  def new
    @queue = Monitor::Queue.new()
    render 'form', :layout => false
  end

  def create
    @queue = Monitor::Queue.new(post_params)

    if (@queue.save)
      @status = 'added'
      render 'success'
    else
      render 'form', :layout => false
    end
  end

  def edit
    @queue = Monitor::Queue.find(params[:id])
    render 'form', :layout => false
  end

  ...
end
Run Code Online (Sandbox Code Playgroud)

/app/models/monitor/queue.rb

module Monitor
  class Queue < ActiveRecord::Base
  end
end
Run Code Online (Sandbox Code Playgroud)

/app/views/settings/form.html.erb

<%= form_for @queue do |f| %>
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

现在Rails抱怨缺少一个方法:monitor_queues_path或者Rails生成一个/monitor/queues代替的路径/settings/queues(:new/edit).

我在这里错过了什么?

Gui*_*ois 5

啊啊我找到了!

这篇文章给了我正确的解决方案: Rails namecoped模型对象没有模块前缀路由路径

问题来自ActiveRecord类的前缀:

module Monitor
  class Queue < ActiveRecord::Base
  end
end
Run Code Online (Sandbox Code Playgroud)

这应该是

module Monitor
  class Queue < ActiveRecord::Base
    def self.model_name
      ActiveModel::Name.new("Monitor::Queue", nil, "Queue")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

更改后我只需要以正确的方式更改form_for:

<%= form_for [:settings, @queue] do |f| %>
Run Code Online (Sandbox Code Playgroud)

这解决了它:D