0

我有以下方法,ApplicationController以便我可以根据用户的权限加载独特的视图。当我在控制器中调用它时它工作正常,但是当我指定一个部分时,我得到了部分的源而不是渲染它。

class ApplicationController < ActionController::Base
  include ControllerAuthentication

  private

  def render(*args)
    options = args.extract_options!
    render_options = _normalize_render(*args)

    location = logged_in? && current_user.is_admin? ? "admin" : "client"

    options[:template] = "/#{location}/#{params[:controller]}/#{render_options[:action] || params[:action]}"

    if options[:partial]
      options[:partial] = "#{location}/#{params[:controller]}/#{options[:partial]}"
    end

    super(*(args << options))
  end
  helper_method :render

end

<%= render partial: "form" %>在页面上输出类似的内容。

["<form ...>...</form>"]

我一直在阅读render 方法的源代码,但我还没有查明是什么原因造成的。我需要更改什么才能正确渲染部分。

4

1 回答 1

1

AbstractController::Rendering 中的 render 方法与 ActionView::Helpers 中定义的行为不同。你得到一个数组的事实是正常的,因为机架堆栈期望和可枚举的身体。

使用 helper_method :render 覆盖 ActionView::Helpers 中定义的渲染方法的实现。

我认为最好为您的控制器命名并提取模块或控制器中的通用功能(如果有),这些功能将用作每个角色的特定实现的基本控制器。

例如你可以有类似的东西:

namespace :admin do
  resources :posts
end

namespace :client do
  resources :posts
end

用于此的控制器将位于 @

app/controllers/admin/posts_controller.rb
app/controllers/client/posts_controller.rb

和意见

app/views/admin/posts/...
app/views/client/posts/...

所以基本上你会达到同样的效果,但以一种更随意的方式,这也解决了视图问题。

于 2012-07-13T12:30:08.057 回答