What have you found for these years?

2008-09-02

406 Not Acceptable

剛剛在處理這個一致性問題。老實講,rails 程式這樣翻來翻去,
感覺 rails 實在不夠成熟,裡面程式不一致性還是很高。
記得也有不少人說 rails doesn't scale, 我現在覺得,似乎確實是這樣沒錯。
(負載一大,吐出空白頁?2008-08-23 奇怪的空白 404 error

又有種受騙之感... 像 mac 那樣。不過算了,反正廣告詞總是要的,逃不掉。

這個問題是使用 respond_to 之後,沒有被指定的 format 會回傳 406,
然後內容是空白的。在這裡:
actionpack-2.1.0/lib/action_controller/mime_responds.rb: 169

@controller.send :head, :not_acceptable

他僅僅用了 head, 所以就變成空白的囉。
這邊我只好加一個簡單的 monkey patch, 改成:

@controller.send :render_optional_error_file, :not_acceptable

這個意思就是如果 public/406.html 存在,則繪出;否則跟 head 效果相同。

*

但是如果沒有使用 respond_to 的話,變成任何 format 都吃!
所以他會吐出 500 Internal Error! 原因是 Missing Template!

查到一年半前有人有這個問題:
http://www.ruby-forum.com/topic/95238

不過他說的在 rails 2.1.0 已經不大對了,而且我測試的結果是不太好用。

我最早的寫法是在 setup_format 中檢查 template 是否存在,
這樣甚至可以跳掉 action 的操作。不過缺點就是這樣我必須產生一堆假的 template.
像是 create.html.erb, show.png.erb, 這些原本就沒有必要存在的東西。

後來想想,其實就算浪費一點 server 資源去算沒必要的東西好像也沒差。
所以如果最後再來檢查 template 在不在,影響應該不大。
這麼一來,變成應該是讓 Missing Template 變成 Not Acceptable 才對。

這個要改比較容易,不需要 monkey, 不過文件裡好像也沒寫,要看 source code.
在 controller 裡加入:

rescue_responses.merge! 'ActionView::MissingTemplate' => :not_acceptable

這樣就能讓 Missing Template 變成 406 Not Acceptable 而不是 500 Internal Error.

*

所以做了這兩個修改,則不管有沒有使用 respond_to, 結果都是 406,
而且如果 public/406.html 存在的話,要畫出來;否則就是空白內容。

p.s. Missing Template 在 development mode 下不會受影響,
所以要測試這個動作要進 production mode. 但是 respond_to 則都會受影響。
我懶得修這個問題了...

不知道 trunk 有沒有改善這個問題?

6 retries:

Plumm said...

> 我懶得修這個問題了...
open source 正是需要 godfat 這樣的人才加入來修正問題的呀 :QQ

Plumm said...

說一下我昨晚試的 Alpha Centuri 加資料片好了,其實我以前就玩過 Alpha Centuri 但是那時沒資料片,昨晚才試了一下資料片。因為以前玩過所以上手還算快。

我先說說這遊戲的特色好了,雖然它是未來式的,可是它是在"單一星球"上,它沒有宇宙飛行的。而且我是玩"世界地圖(小)",新手先挑一個熟悉的地圖比玩亂數地圖會容易上手許多,小型地圖表示不會拖太久。

其次是這遊戲雖然是未來的,但是在資料片才加入了兩個外星人,像我之前看了一下 Gal Civ2 的陣營,一堆外星人看了實在沒什咩好感,但是這個 Alpha Centuri 它大多是地球人,主程式七個陣營都是地球人,資料片七個陣營之中有兩個是外星人。開場時單純一點,我就沒挑外星人當對手。

其實總共有哪些主角呢?這個遊戲的背景是如果我沒記錯,太空船墜毀,一堆不同組織的人民掉到同一個星球上。主程式有環保組織、人民公社、宗教組織、軍事單位、商業集團、大學研究聯盟、和平人道協會,一看之下就是每個都完全不同,當然打法也會或多或少有差異,可以挑自己喜歡的。資料片七族,兩族外星人一個是侵略型一個防守型的,人類五個陣營,分別是海賊組織、駭客組織、機器生化人(Cyborg)組織、勞工集團、星球原生協會。

一開始玩,當然把難度調低才能享受快感,畢竟如果不太熟還是不要太整自己,免得被敵人痛電時摔鍵盤砸螢幕的,一切從簡。

基本上,我犯的一個錯誤就是敵人竟然選了一個海賊組織,它基地全建在海上,要打海戰又很麻煩,還沒研發到水陸兩用槽之外 ( 對方應該是天生就有水陸兩用吧,沒研究 ),另一邊的駭客組織一天到晚就來偷我科技,然後勞工組織兩下就被原生協會滅掉了 ( 看來勞工組織還是弱勢 )。

總之就先隨便玩玩,最近要準備考試還是不能玩太兇。

godfat 真常 said...

你這我晚點再回 O_o

Plumm said...

忘了說,像這類遊戲往往都有多個勝利條件的,最容易想的就是"軍事勝利",讓其他國家全滅亡或臣服於你,還有"研發勝利",通常研發到最後會有一個研發到了就贏了的,而 Alpha Centuri 還有"外交勝利",召開議會大家選擇投票這個星球全權交給你管,或是"經濟勝利",國家錢太多可以買下其他國家所有東西。外星種族也有自己專用的勝利條件。

當然每個陣營擅長的東西不同,要走哪一條路的難度會不一樣,像和平人權組織,擅長的是外交,而商業組織擅長走商業。不過每個陣營也都有它相關的弱點,而且還有一些設定上不利的程度,像是大學研發組織,一看就是擅長研發,但是網路開放(因為要 Open Source :XD ?) 的結果就是抗 Hacker 能力 -50% 的不利要素,誰會討厭這研發組織呢?是宗教組織,宗教設定上討厭科學,如果一開始它就在你家隔壁的話,被攻擊的機率很大的。

老林 said...

AC 和 AC:Alien Crossfire 我都是很久以前玩的,
我記得我每次都一定玩大學組織。

挑大學組織的重點就是 Knowledge is power,
科技領先通常也就代表很多東西的領先。

AC 系列有個很不錯的特色我不知道為什麼 Civ 系列總是不用:
AC 系列有 height map 的概念,
Civ 則完全沒有。
當你用 planet buster 炸下去的時候,
還會改變地形 ...也就是 height map 的狀況。
不過高度差實際的作用我已經忘光了,我只記得在單位交火時有優劣差異,
譬如說攻方在低處,那守方的 def 會有 positive mod ...

以自由度和複雜度來說我覺得 AC 系列比 Civ 高,
但可惜資料片評價沒有太好,而且包括主遊戲在內好像都賣不好。
導致後來此系列就此消失 ....

GalCiv2 居然是因為討厭都是外星人而不玩 XD
我倒是因為 GalCiv2 灌在舊電腦上,新電腦上又沒空間灌了 ...只好暫時不動。
其實我 GalCiv2 總遊戲時數還沒超過 10 hrs...

最近買了 for 360 的 Civilization Revolution,
昨天把 360 三紅修好了才開始玩,
真是頗為華麗的 Civ,比 4 代還華麗很多。
遊戲內容上因為才玩一下子,先不討論,
但介面上真的讓我感覺做得不錯,
如此複雜的遊戲竟然也能 fit 到 console platform 上 ....
不過我看了看科技樹是覺得科技和單位種類,
好像是有刪減了一些的感覺。

Plumm said...

> 科技領先通常也就代表很多東西的領先
常常被人偷走科技也是,尤其是那宗教組織,研發超不利,前10回合無法研發,和研發 -50% 很傷,但是網路上看有人說一開始就完全放棄研發,直接攻擊對手搶對手科技的打法也是有。

> AC 系列有 height map 的概念
斜坡上好像不能蓋城市 @@

> 以自由度和複雜度來說我覺得 AC 系列比 Civ 高
Civ4 沒碰過不知道自由度和複雜度多少了 @@

> GalCiv2 居然是因為討厭都是外星人而不玩
我懶得玩人類(Terran),但是其他外星人沒有看得順眼的,我覺得它美術風格和我不太合。

> 如此複雜的遊戲竟然也能 fit 到 console platform 上
理論上是電腦能跑的 Console 應該都可以啦。

Post a Comment

All texts are licensed under CC Attribution 3.0