1

たとえば<%= render "layouts/location" %>、サイト全体のビューにパーシャルを配置しています。レイアウト用のコントローラーが必要なので( layouts_controller.rb を試しました)、できるようになりました

def _location
    @city = request.location.city
    @state = request.location.state
  end

パーシャルにはコードが含まれています<%= @city %>, <%= @state %>

これはすべて事実上、パーシャルがレンダリングされるページに訪問者の都市と州を表示することになっています。

ただし、これを行い、heroku にプッシュしてデータベースを移行すると、エラーが表示されます: アプリケーションでエラーが発生し、ページを提供できませんでした。しばらくしてからもう一度お試しください。

アプリケーションの所有者である場合は、ログで詳細を確認してください。

問題は、パーシャルの関数をどのように定義すればよいかということです。

4

3 に答える 3

3

次のように、アプリケーション コントローラーの before フィルターでこれを行うことができます。

...
before_filter :location

def location
    @city = request.location.city
    @state = request.location.state
end

メソッドの名前は、呼び出しのシンボルと一致する必要がありbefore_filterますが、それ以外は、必要に応じてメソッドを呼び出すことができます。ただし、メソッドは ApplicationController クラスにある必要があります。

明確化:これは、アプリケーションのすべてのリクエストの前に呼び出され、これら 2 つのインスタンス変数を設定するため、すべてのビューで常に @city と @state に自動的にアクセスできます。

于 2012-04-11T20:11:23.193 に答える
2

他のソリューションからいくつかの改善を加えることができると思います。

ApplicationController で

class ApplicationController < ActionController::Base
    before_filter :set_location, only: [:index, :show, :edit]

    def set_location
      @city = request.location.city
      @state = request.location.state
    end
end

create、update、destroy アクションにはこれらの変数は必要ない可能性が高いため、使用するonly: [...]のは良い考えのようです。そこに他のカスタムメソッドを追加できます。その主な問題は、createアクションが失敗したときであり、「編集」ページをレンダリングする必要があります。編集ページでこれらの変数が必要ない場合は、すべて問題ありません。set_locationそれ以外の場合は、自分自身を呼び出す必要があります。

def create
    @lala = Lala.new(...)
    @lala.save
    set_location if @lala.errors.any?
    respond_with @lala
end

また、これらの変数を必要としない 30% のページでは、以下を使用できますskip_before_filter

 class BlogsController < ApplicationController
    #assume you dont need those variables in your blog

    skip_before_filter :set_location # you can also use only: [:index, ...] here
 end
于 2012-04-11T20:18:46.707 に答える
1

You should take a look at cells. It is an awesome, but rather unknown gem that allows you to structure your application in "cells". It might be just what you need.

于 2012-04-11T20:25:46.430 に答える