Как настроить «полиморфные контроллеры» на current_account в rails3-приложении с несколькими доменами - PullRequest
1 голос
/ 21 апреля 2011

Я пытаюсь использовать модель полиморфного комментария для модели поста, модели загрузки и т. Д. Обычно у меня был бы ресурс @parent, чтобы связать один с другим, чтобы Rails выстроил отношения. Но поскольку это приложение в стиле мультитенантного субдомена, где все ресурсы также должны быть ограничены областью curent_account. Я борюсь с тем, как охватить ресурс @parent под current_accout.

В ApplicationController у меня есть метод current_account, метод find_parent и parent_collection:

#Application_controller
class ApplicationController < ActionController::Base
  before_filter :current_account

  def current_account
    unless is_root_domain?
     @current_account ||= Account.find_by_subdomain(request.subdomains.first)
    end
  @current_account
  end

 def find_parent
   params.each do |name ,value|
    @parent = $1.pluralize.classify.constantize.find(value) if name =~ /(.*?)_id/
  return if @parent
  end
 end

 def parent_collection
   @parent_collection ||= current_account.send parent.pluralize
 end

конец

#comments_controller with only @parent resource without reference to current_account
class CommentsController < ApplicationController
  before_filter :find_parent

  def new
    @comment = @parent.comments.build
  end

  def create
   @comment = @parent.comments.build(params[:comment])
   .....
   .....
  end
end

#comments_controller using only current_account resource without reference to @parent
class CommentsController < ApplicationController
  before_filter :current_account

  def new
    @comment = current_account.comments.build
  end

  def create
    @comment = current_account.comments.build(params[:comment])
    .....
    .....
  end
end

Любое руководство о том, как вызывать current_accout в контроллерах таким образом, чтобы @parent находился в нем, и есть ли необходимость в методе parent_collection, который я поместил в application_controller. Спасибо

1 Ответ

0 голосов
/ 21 апреля 2011

Давайте предположим, что ваш ресурс @parent является моделью Post. Тогда я бы предположил, что:
а) ваша Account модель has_many :posts
б) ваша Post модель belongs_to :account
в) ваша Post модель has_many :comments, :as => :commentable
в) ваша Comment модель belongs_to :commentable, :polymorphic => true

Итак, помня об этом, вы должны иметь возможность создавать области видимости следующим образом:

@parent.where(:account_id => current_account.id).comments

Вы также можете рефакторинг для соответствующей модели:

def Post < ActiveRecord::Base
  scope :by_account, lambda { |account_id| where(:account_id => account_id) }
end

и использовать его в контроллере следующим образом:

@parent.by_account(current_account.id).comments
...