我在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,但我没有指出导致这种情况的原因。我需要更改什么才能正确渲染部分。
答案 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/...
所以基本上你会达到同样的效果,但是以更多的方式,这也解决了观点问题。