Как привязать «полиморфные контроллеры» к current_account в приложении в стиле мультиарендного поддомена rails3

Я пытаюсь использовать полиморфную модель комментариев для модели публикации, модели загрузки и т. д. Обычно у меня был бы ресурс @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. Спасибо


person brg    schedule 21.04.2011    source источник


Ответы (1)


Предположим, что ваш ресурс @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
person Ivan    schedule 21.04.2011
comment
Большое спасибо за этот ответ, все ваши первоначальные предположения верны. Как вы думаете, я убрал метод parent_collection из application_controller, так как я не уверен, что он все еще необходим. Спасибо еще раз. - person brg; 21.04.2011
comment
Я не думаю, что на данный момент необходимо иметь этот метод. Я просто не вижу, чтобы вы его использовали. «Меньше кода» часто равно «лучшему коду»;) - person Ivan; 21.04.2011