web-dev-qa-db-ja.com

rails 3、どのようにアプリの他の部分と同じレイアウトを使用しないビューを追加しますか?

同じコントローラー内の異なるビューがまったく異なるレイアウトとスタイルシートを使用できるようにアプリを構成する方法に関するドキュメントや例が見つかりませんでした。

私たちのアプリは足場になっていて、nifty-generatorを使用してビューを生成し、認証のための工夫を追加しました。ウィジェットと企業の2つのモデルのビューとコントローラーがあります。

私は現在、単一のレイアウト:layouts/application.html.hamlを持っていますが、どこにも参照されていないので、(a Rails newbie)は常に命名規則で使用されていると仮定します。

同じコントローラー内に、異なるスタイルシートとレイアウト(たとえば、右上にログイン/ログアウトリンクがない)を持つ2つのビュー(モバイルブラウザー用)を追加する必要があります。

どうすればそれができますか?

51
jpwynn

デフォルトでは、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
129
PeterWong

複雑すぎないようにするには、次のようにします。

layout 'layout_one'

 def new
   @user= User.new
  render layout: 'landing_page'
  end

これでできます。

4
Lesly Revenge

これにはたくさんの答えがあると確信していますが、コントローラーごとまたはアクションごとに異なるレイアウトを使用できる別の方法があります。

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
4
zechtz

はい、同じコントローラ内で異なるレイアウトとスタイルシートを使用できます。

レイアウトのRailsガイド は開始するのに適した場所です。セクション3-レイアウトの構築

異なるレイアウトを使用する方法はいくつかありますが、最も簡単な方法の1つは、layouts/フォルダーにコントローラーと同じ名前のファイルを追加することです。コントローラがPostsControllerの場合、layouts/post.html.hamlを追加するとRailsがそのレイアウトを使用します。そのようなレイアウトが見つからず、他のレイアウトが指定されていない場合、 Railsはデフォルトのlayouts/application.html.hamlを使用します

3
Dty

それは、モバイルデバイスのビューが異なるが、すべてのデスクトップバージョンが同じである場合、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の例から取られています。

1
dannymcc