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 で定義されているものとは異なる動作をします。ラック スタックはボディに Enumerable を期待しているため、配列を取得しているという事実は正常です。

helper_method :render を使用して、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/...

したがって、基本的には同じ効果を実現できますが、より手荒な方法で実現できます。これにより、ビューの問題も解決されます。

于 2012-07-13T12:30:08.057 に答える