我刚开始使用rails,直到现在我对它非常满意,但有一点我无法弄明白。
我在命名空间“Monitor”中有一些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 :(得分: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
答案 1 :(得分:0)
您正在为Queue
模型使用嵌套。因此,您的form_for
调用也需要了解父模型。因此,在您的情况下,您在Queue
下嵌套了Setting
,因此您还需要提供setting
对象。我猜你的控制器中你做了一个@setting
变量。如果是这种情况,那么以下代码将适合您。
<%= form_for [@setting, @queue] do |f| %>
<%# Your form code here -%>
<% end -%>
答案 2 :(得分:0)
我找到了朋友@mkhairi的解决方案,他说要在父模型上使用它:
class YourParentModel < ApplicationRecord
def self.use_relative_model_naming?
true
end
end
然后你可以使用你可爱的短路径。
资料来源: https://coderwall.com/p/heed_q/rails-routing-and-namespaced-models