1

例如,我將遍佈整個站點的部分<%= render "layouts/location" %>放在視圖中。我需要佈局的控制器(我試過layouts_controller.rb),所以我可以做如何在控制器中定義一個局部函數以在所有視圖中工作? Ruby on Rails

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

的部分包含的代碼<%= @city %>, <%= @state %>

這是所有有效,應該顯示訪問者的城市和國家在任何頁面上渲染部分。

然而,當我這樣做,並推送到heroku和遷移數據庫,我得到錯誤: 應用程序中發生錯誤,您的網頁無法送達。請稍後重試。

如果您是應用程序所有者,請查看日誌以獲取詳細信息。

所以問題是,我該如何定義一個函數的部分?

+0

這是部分使用_a lot_?因爲你可以在ApplicationController中設置一個'before_filter'來爲你設置這些變量。即使你的部分被使用了,比如在40%的頁面中,在每個請求中花費幾毫秒來設置這些變量也不是什麼大問題。 – MrDanA 2012-04-11 20:00:48

+0

葉,就像70%的頁面,我會before_filter然後def位置?或_location?要麼 ? – Laser 2012-04-11 20:06:21

+0

我會舉一個例子作爲答案。 – MrDanA 2012-04-11 20:09:41

回答

3

你可以在過濾器之前在應用程序控制器做到這一點,像這樣:

... 
before_filter :location 

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

方法的名稱必須匹配在before_filter呼叫的符號,但除此之外,你可以調用方法無論你想要什麼。該方法必須在ApplicationController類中。

澄清:這將在應用程序中的每個請求之前調用,併爲您設置這兩個實例變量,因此在每個視圖中,您將始終自動訪問@city和@state。

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 

這可能是因爲你不需要爲創建,更新和銷燬行動,這些變量,所以使用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 
1

您應該採取看看cells。這是一個很棒的,但卻是未知的gem,它允許你在「單元格」中構建你的應用程序。這可能正是你需要的。

相關問題