2013-07-23 3 views
0

Я только начал с рельсов, и до сих пор я был очень доволен этим, но есть одна вещь, которую я не могу понять.Пространства имён и модельные пути рельсов

У меня есть несколько моделей 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 также должен знать о родительской модели. Таким образом, в вашем случае вы вложили Queue под номером Setting, поэтому вам нужно будет предоставить объект setting. Я предполагаю, что в вашем контроллере вы сделали переменную @setting. Если это так, то для вас будет работать следующий код.

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

Нет, я просто с помощью пространства имен, чтобы обеспечить правильные пути. @settings - это не объект или что-то такое. –

5

Aah Я нашел его!

Это сообщение дало мне правильное решение: 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 

После изменения I необходимо изменить форму form_for правильным образом:

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

И фиксирует это: D

+0

это просто потрясающе –

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

Смежные вопросы