2016-04-14 2 views
0

Я создаю приложение с множеством приложений, основанное на идеях книги Райана Бигга «Многопользовательская связь с рельсами». В этой книге арендаторы имеют свой собственный поддомен. Этот подход не применим в моем случае, поэтому я пытаюсь использовать область с помощью имени учетной записи.Маршрутизация Rails: Область применения поля базы данных

Так что вместо URL-адресов, как http://account-name.myapp.com, я хочу http://myapp.mydomain.com/account-name/. Субдомен зарезервирован для самого приложения, потому что я хочу иметь более одного приложения в своем домене.

Вот кусок моего routes.rb:

scope module: 'accounts' do 
    resources :customers do 
    resources :notes 
    end 
end 

Чтобы достичь своей цели, я стараюсь следовать руководству маршрутизации на rubyonrails.com (последний фрагмент кода в главе 4.5), и изменить приведенный выше код :

scope ':slug', module: 'accounts' do 
    resources :customers do 
    resources :notes 
    end 
end 

slug является атрибутом в accounts таблицы в базе данных, поэтому, если учетная запись называется «Мой бизнес», слизняк обычно будет «мой бизнес».

Это изменение, кажется, исправить мои маршруты:

customers GET /:slug/customers(.:format) 

.. но это также, кажется, сломать мой сайт, как слизняк не извлекается из базы данных. Я не могу представить, как это работает scope':slug', module: 'accounts'. Должен ли Rails автоматически распознавать: slug как атрибут таблицы Accoounts? Если нет, может ли кто-нибудь помочь мне найти способ использовать пул аккаунта в моих URL-адресах?

Я уже пару дней пробовал погулять и читал многочисленные ответы здесь на Stackoverflow. Ничто не помогло, поэтому любые указатели очень ценятся. :-)

EDIT:

Соответствующие контроллеры настроены так:

controllers/accounts/base_controller.rb 
controllers/accounts/customers_controller.rb 
controllers/accounts/products_controlelr.rb 
controllers/accounts_controller.rb 
controllers/application_controller.rb 

accounts_controller.rb имеет только действия для новых и создать в этой точке.

Счет/base_controller.rb выглядеть следующим образом:

module Accounts 
class BaseController < ApplicationController 
    before_action :authorize_user! 

    def current_account 
    @current_account ||= Account.find_by_slug(params[:slug]) 
    end 
    ... 
end 
end 

Я addded это моя модель счета:

def to_param 
    slug 
end 

Прежде я пытался реализовать scope ':slug' в моих маршрутах, Everyting работал при входе в тех случаях, когда они направлены на myapp.mydomain.com/dashboard и перемещаются по адресу myapp.mydomain.com/customers. Теперь он работает с myapp.mydomain.com/account-name/dashboard, но как только я попытаюсь перейти к представлению, в котором используются помощники, такие как new_customer_path, я получаю сообщение об ошибке:

Нет совпадений маршрутов {: action => «show»,: controller => «accounts/customers»,: id => nil,: slug => #

Надеюсь, это упростит мою проблему. :-)

+0

так что вы хотите URL выглядит как 'Http: // MYAPP. счет-имя mydomain.com// 'клиентов? –

+0

Да, «клиенты» - это один из примеров моих контроллеров в модуле учетных записей – GreyEyes

ответ

0

Я не уверен, что ваши маршруты настроены правильно или нет, потому что вы не опубликовали исходный код вашего контроллера, но в основном, как это работает, если очень просто.Если вы используете текущие маршруты, которые вы создали, что вы должны сделать, это создать account_customers_controller.rb файл в папке controllers\account\, и она должна выглядеть следующим образом:

class Accounts::CustomersController < ActionController::Base 
    def show 
    @account = Account.find_by_slug(params[:slug]) 
    ... 
    end 
end 
+0

привет, если вы нашли его полезным, пожалуйста, примите мое решение, или если у вас есть проблема, я могу помочь больше –

+0

Вот и все! Я также должен был обновить свой «link_to», поэтому они использовали помощников с параметром «params [: slug]», но ваш ответ помог мне исправить мои учетные записи/base_controller.rb, как показано в обновленной части моего вопроса. Спасибо за вашу помощь! :-) – GreyEyes

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