2013-07-23 115 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

這真是太棒了 –