多租户应用程序的rails overriding / scoping视图

时间:2014-08-12 09:34:22

标签: ruby-on-rails ruby-on-rails-4 view multi-tenant

我想知道如何界定我的观点。我想根据组织有自定义主题,我可以直接在show / index操作上使用渲染......这样可行,但我必须覆盖我的应用程序上的很多操作。我更喜欢在控制器级别上执行此操作,并尝试使用prepend_view_path执行此操作,但除了变量为undefined之外没有。

class EditionsController < ApplicationController
  helper_method :current_organization
  prepend_view_path "app/views/#{current_organization.slug}/editions" #doesn't work

  def show
    @edition = Edition.find(params[:edition_id])
    @page = @edition.pages.first
    render template: "#{current_organization.slug}/editions/show" #works
  end

有什么想法吗?

还试过:(同样的错误)

append_view_path(File.join(Rails.root, "app/views/#{current_organization.slug}"))

2 个答案:

答案 0 :(得分:2)

  

自定义主题取决于组织

当然,定义自定义layouts&amp;每个公司CSS而不是完全不同的视图集?

-

我个人会这样做:

#app/layouts/application.html.erb
<%= stylesheet_link_tag "application", controller_name ... %>

这将使我能够根据主题设置不同页面的样式。显然是对你想要的东西的限制,但我希望它能说明你如何模块化你的控制器等

-

如果您想创建不同的“主题”(每个租户的视图结构完全不同的IE),您需要使用prepend_view_path帮助器,如here所述:

#app/controllers/application_controller.rb
Class ApplicationController < ActionController::Base
   prepend_view_path("views/#{current_organization.slug}")
end

答案 1 :(得分:0)

尝试删除editions

中的prepend_view_path
prepend_view_path "app/views/#{current_organization.slug}"

确保添加的方式。如果它没有添加before_filter