Rails 3.2 - 自定义渲染方法返回数组中部分的源

时间:2012-07-12 18:55:24

标签: ruby-on-rails

我在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>"]

我一直在阅读source of the render method,但我没有指出导致这种情况的原因。我需要更改什么才能正确渲染部分。

1 个答案:

答案 0 :(得分:1)

AbstractController :: Rendering的render方法与ActionView :: Helpers中定义的方法有不同的行为。您获得阵列的事实是正常的,因为机架堆栈需要和身体可以枚举。

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

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

例如,您可以使用以下内容:

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/...

所以基本上你会达到同样的效果,但是以更多的方式,这也解决了观点问题。