在顯示每一頁的title時,我想使用一些定義在controller中的變數當作title。於是寫了一個ApplicationController
的method如下:
class ApplicationController < ActionController::Base
# ...
before_filter :gen_title
# ...
private
def gen_title
app_name = ENV["APP_NAME"]
if @page_title
@title = "\#{app_name} - \#{@page_title}"
else
@title = app_name
end
end
# ...
end
可是因為@page_title
這個變數是在controller中被設定,如果gen_title
放在before_filter
,則這個@page_title
變數會沒有機會被設定而造成它們永遠都是nil。
呼叫gen_title
最好的時間點是在controller跑完要做render的這個時間點,不過rails似乎沒有這種filter。還好SO上有人提供個好方法,就是覆寫render
這個method,方式如下:
class ApplicationController < ActionController::Base
# ...
# remove gen_title from the before_filter
# ...
def render *args
gen_title
super
end
# ...
private
def gen_title
# same as before
end
# ...
end
當然如果在ApplicationController
中覆寫render
,就表示會改到所有的render行為(以我這個例子而言是沒有問題,因為每個頁面應該都要gen_title
)。如果只針對需要的頁面才做的話,就在一般的controller中覆寫render
就好。
stackoverflow - Filter to execute before render but after controller?