1

我刚开始使用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).

我在这里想念什么?

4

3 回答 3

6

啊啊我找到了!

这篇文章给了我正确的解决方案: 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

于 2013-07-24T07:21:02.760 回答
1

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

<%= form_for [@setting, @queue] do |f| %>
    <%# Your form code here -%>
<% end -%>
于 2013-07-23T20:16:47.190 回答
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

于 2017-03-23T12:15:27.310 回答