同じコントローラー内の異なるビューがまったく異なるレイアウトとスタイルシートを使用できるようにアプリを構成する方法に関するドキュメントや例が見つかりませんでした。
私たちのアプリは足場になっていて、nifty-generatorを使用してビューを生成し、認証のための工夫を追加しました。ウィジェットと企業の2つのモデルのビューとコントローラーがあります。
私は現在、単一のレイアウト:layouts/application.html.hamlを持っていますが、どこにも参照されていないので、(a Rails newbie)は常に命名規則で使用されていると仮定します。
同じコントローラー内に、異なるスタイルシートとレイアウト(たとえば、右上にログイン/ログアウトリンクがない)を持つ2つのビュー(モバイルブラウザー用)を追加する必要があります。
どうすればそれができますか?
デフォルトでは、layouts/application.html.haml
(.erb
hamlを使用していない場合)。
実際、レイアウトファイルは、ビューごと、ビューフォルダごとではなく、コントローラーごと、またはアクションごとに設定できます。
いくつかのケースがあります:
another.html.haml
の代わりに application.html.haml
)class ApplicationController < ActionController::Base
layout "another"
# another way
layout :another_by_method
private
def another_by_method
if current_user.nil?
"normal_layout"
else
"member_layout"
end
end
end
class SessionsController < ActionController::Base
layout "sessions_layout"
# similar to the case in application controller, you could assign a method instead
end
def my_action
if current_user.nil?
render :layout => "normal_layout"
else
render :action => "could_like_this", :layout => "member_layout"
end
end
複雑すぎないようにするには、次のようにします。
layout 'layout_one'
def new
@user= User.new
render layout: 'landing_page'
end
これでできます。
これにはたくさんの答えがあると確信していますが、コントローラーごとまたはアクションごとに異なるレイアウトを使用できる別の方法があります。
class ListingsController < ApplicationController
# every action will use the layout template app/views/layouts/listing_single.html.erb
layout 'listing_single'
# the 'list' action will use the layout set in the 'alternative_layout' method
# you can also add multiple actions to use a different layout,just do like layout :alternative_layout, only: [:list,:another_action]
layout :alternative_layout, :only => :list
def show
end
def list
end
private
def alternative_layout
if current_user.is_super_admin?
#if current use is super admin then use the layout found in app/views/layouts/admin.html.erb otherwise use the layout template in app/views/layouts/listing_list.html.erb
'admin'
else
'listing_list'
end
end
end
はい、同じコントローラ内で異なるレイアウトとスタイルシートを使用できます。
レイアウトのRailsガイド は開始するのに適した場所です。セクション3-レイアウトの構築
異なるレイアウトを使用する方法はいくつかありますが、最も簡単な方法の1つは、layouts/
フォルダーにコントローラーと同じ名前のファイルを追加することです。コントローラがPostsController
の場合、layouts/post.html.haml
を追加するとRailsがそのレイアウトを使用します。そのようなレイアウトが見つからず、他のレイアウトが指定されていない場合、 Railsはデフォルトのlayouts/application.html.haml
を使用します
それは、モバイルデバイスのビューが異なるが、すべてのデスクトップバージョンが同じである場合、JQtouchを使用できます。
http://railscasts.com/episodes/199-mobile-devices
# config/initializers/mime_types.rb
Mime::Type.register_alias "text/html", :mobile
# application_controller.rb
before_filter :prepare_for_mobile
private
def mobile_device?
if session[:mobile_param]
session[:mobile_param] == "1"
else
request.user_agent =~ /Mobile|webOS/
end
end
helper_method :mobile_device?
def prepare_for_mobile
session[:mobile_param] = params[:mobile] if params[:mobile]
request.format = :mobile if mobile_device?
end
上記のコードはRailscastsの例から取られています。