2013-07-23 181 views
0

我刚刚开始使用rails,直到现在我对它感到非常满意,但有一件事我无法弄清楚。命名空间路径和模型路径导轨

我在命名空间“监视器”中有一些ActiveRecords模型,并且在命名空间“设置”中有一些控制器。我想要完成的是我可以在我的设置控制器/表单中使用名称空间模型。

我有这样的:

/config/routes.rb

namespace :settings do 
    resources :queues, :channels 
end 

/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 

/app/models/monitor/queue.rb

module Monitor 
    class Queue < ActiveRecord::Base 
    end 
end 

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

<%= form_for @queue do |f| %> 
    ... 
<% end %> 

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

我在这里错过了什么?

回答

0

您正在为Queue型号使用嵌套。因此您的form_for调用也需要了解父模型。所以在你的情况下,你在Setting下嵌套Queue,所以你还需要提供一个setting对象。我在你的控制器中猜测你做了@setting变量。如果是这种情况,那么以下代码将适用于您。

<%= form_for [@setting, @queue] do |f| %> 
    <%# Your form code here -%> 
<% end -%> 
+0

不,我只是使用的命名空间,以提供正确的路径。 @settings不是一个对象或以往的东西。 –

5

啊我发现了!

这篇文章给我的妥善解决: Rails namescoped model object without module prefix route path

的问题来自于前缀从ActiveRecord类:

module Monitor 
    class Queue < ActiveRecord::Base 
    end 
end 

这应该是

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

改变这一点,我以后只需要以正确的方式更改form_for:

<%= form_for [:settings, @queue] do |f| %> 

并修复它:d

+0

这真是太棒了 –