Railsã®before_filterã¿ãããªã®ãSinatraã§å®ç¾ã§ããã
ãRailsã¯ä¾¿å©ã ã¨ã¯æã£ãããã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦ã¨ãã«å¥½ãã§ã¯ãªãã£ãï¼å¥ã«å«ãã§ããªãï¼ãããã«å¯¾ãã¦Sinatraã¯ãªãã ãããã§ãã¦ãæããã£ã¦æ°ã«å
¥ã£ã¦ããããã®å·®ãã©ãããããã®ãã¯ããããããªããã
ããããªSinatraã¨Railsã§ããããæ¯è¼ãã¦ã¿ãã¨ããã£ã«ã¿ã¾ããã¯å§åçã«Railsã®æ¹ãé«æ©è½ã§ãããSinatraã®ãã£ã«ã¿ã¯beforeã¨ããä¸ç¨®é¡ã§ããããå
±éå¦çãæ¸ããã ãã§ããããããªæãã
before do if not logged_in? redirect '/' end end
Railsã¨æ¯ã¹ãã¨
- å¼ã¶ã¿ã¤ãã³ã°ãbeforeãããªããRailsã ã¨before_filter, after_filter, around_filterã®3種é¡ã®ãã£ã«ã¿ãããã
- ã©ã®ã¡ã½ããã«å¯¾ãã¦ãã£ã«ã¿å¦çãè¡ãããå¶å¾¡ã§ããªããRailsã¯before_filter :filter1, except => :show ã¿ãããªæãã§ããã®ã¡ã½ãã以å¤ã«å¯¾ãã¦ã¯ãã®ãã£ã«ã¿ã¼ãå¼ã¶ãã¿ãããªã«ã¹ã¿ãã¤ãºãã§ããã
- ãã£ã«ã¿ã§HTMLãåºåãã¦å¦çãçµãããããã¨ãã§ããªããï¼ããã¯ã§ãããããããªãããã©ãæ®éã«æååãè¿ãã ãã§ã¯ãã¡ã ã£ããï¼
ãã¨ãããããªç¹ã§ä¸æºããããå®éã®ã¨ããbeforeãã£ã«ã¿ã ãããã°ã»ã¨ãã©ã®ç¨ã¯è¶³ããã®ã§after_filterããªãã®ã¯å¥ã«æ§ããªãã®ã ããæ®ã2ã¤ã®åé¡ã¯çµæ§åä»ã ãæ·±å»ã ãã¾ããããããå¦çãè¤éã§èããããªããããªè¦æ¨¡ã®ã¦ã§ãã¢ããªã¯ãã¶ãSinatraãããRailsãMerbãªã©ã®æ¹ããµããããã®ã ãããã¨ããæ°ãããããSinatraã§ããããªãããã¡ãã£ã¨èãã¦ã¿ããã
ãã©ã®ã¡ã½ããã«å¯¾ãã¦ãã£ã«ã¿å¦çãè¡ããããããã¯è¡ããªãããã¨ããæå®ã¯Sinatraã§ã¯ä¸å¯è½ã§ããããªããªãããããã³ã³ããã¼ã©ã¯ã©ã¹ãå®è£
ãã¦ã¡ã½ãããå®ç¾©ãã¦â¦ãã¿ãããªå®è£
ã®ä»æ¹ã§ã¯ãªãã
get '/' do "hello world" end
ã¿ããã«ãå®éã«å¦çãããã³ã¼ãããããã¯ã¨ãã¦æ¸¡ãã¦ããããã ãã¡ã½ããã¨ãã¦ååãã¤ãã¦ããªãã®ã§ã¡ã½ããåã§ã¯æå®ã§ããªããã¾ããããã¯URLã«å¯¾ããæå®ã§ææ ¢ããã°è¯ãããããªã¯ã¨ã¹ãURLã¯request.urlã§åããã®ã§ãããã«å¯¾ãã¦æ£è¦è¡¨ç¾ãä½ãã§æå®ãããã°è¯ãã
before do if request.url =~ /$\/admin/ not logged_in? redirect '/' end end
ãã¿ãããªæãã
ãæ®ãã®ã¯ããã£ã«ã¿ã®ä¸ããHTMLãåºåãã¦çµäºãã¨ããå¦çãæ¸ããªãã¨ããã§ããããã®åé¡ã¯ã©ããããããªãã
ãããã§çºæ³ãå°ãå¤ãã¦ã¿ããbeforeã使ããã«getã§ãã£ã«ã¿ãæ¸ãã¦ããã°è¯ãã®ã§ã¯ãªããï¼
get '*' do if request.url =~ /$\/admin/ not logged_in? redirect '/' end ãããã辺ã§é©å½ã«request.urlã«ãããã£ã¦redirect end
ãããããã®ã¢ã¤ãã¢ã«ã¯åé¡ããã£ã¦ãredirectãããã¨å®éã«ãã®æç¹ã§ãã©ã¦ã¶ã«302ã§ãªãã¤ã¬ã¯ããéãã®ã§ããããªãã¤ã¬ã¯ãã®æ¿«ç¨ã¯å¥½ã¾ãããªãããããããpostã«ã¯ä½¿ããªãã ããã
ãããã§ãªããããã¡ã½ãããªãããªãã¨API Referenceãçºãã¦ããããpassã¨ããã¡ã½ãããè¦ã¤ãã£ãã
ããªãã ãååçã«pythonãæãåºãã¡ã½ããåã ããããã¯ãã¦ãããpassã¯ãã®ãªã¯ã¨ã¹ããã³ãã©ã§ã®å¦çãåãããã¦æ¬¡ã®ãã³ãã©ã¸å¦çã移ãã¡ã½ããã§ãããï¼ã¿ã¤ãããªãã£ãã404ã«ãªãï¼
ãããã使ããã¨ã§ãRailsã®before_filterã£ã½ããã®ãå®è£
ãã¦ã¿ãã
def before_filter filter_url, &filter_proc get filter_url do filter_proc.call end post filter_url do filter_proc.call end end before_filter '/admin*' do if login_as_admin? throw :pass else "required login as admin" end end get '/admin' do return "admin page" end
ãlogin_as_admin?ãé©å½ã«trueã«ãã¦ã¿ããfalseã«ãã¦ã¿ããããã¨ãbefore_filterãåãã¦ãããã¨ã確èªã§ãããpassãããªãã¦throw :passã¨ãªã£ã¦ããã®ã¯ãbefore_filterããpassãæãããã¨ããã¨ãNoMethodErrorã«ãªãããã ããªããããªããã¯å¾è¿°ããããã©ããã£ã¦è§£æ±ºããã°ããã®ãã¯åãããªãã
ããã¦ããã®ä¸è¦ä¾¿å©ããã«è¦ããbefore_filterã ããå®è£
ãè¦ã¦åãããããããªãããå®ç¨ããã«ã¯ã¡ãã£ã¨é£ããããå
·ä½çã«ã¯ãbefore_filterã®æ¹ãgetãpostãªã©ã®ã¡ã½ãããããå
ã«å¼ã°ããªãã¨ãããªããã¨ããå¶éãããã
ããã¡ãããæ®éã«æ¸ãã¨ãã£ã«ã¿ã®æ¹ãä¸ã«æ¸ãããã ããããåé¡ã¯èµ·ããªãã¯ãã ããããããç©´ãæ®ãã¦ããã¨ãã¯ã¾ã人ã¯çµ¶å¯¾ã«åºã¦ãããã®ãªã®ã§ããã®ããæ¹ã¯æ°ã«ãããªããã¾ããbefore_filterå
ã§returnãã§ããªãã£ããããããããããä¼¼ãããã«æ¸ãã¦ç´°ããéãããããã¨ããã®ã¯è
¹ç«ãããã
ãreturnãã§ããªãã®ã¯ãããã¬ãã«ã ããå½ããåã§ãéã«getã«æ¸¡ãããããã¯ã®ä¸ããã¯ãªãreturnãã§ããã®ããã§ãã¦ãããã¡ãã®æ¹ãä¸æè°ã§ããã
ãã³ã¼ããèªãã§è¦ãã¨ãããgetã¡ã½ããã§æ¸¡ããããããã¯ã¯æçµçã«ã¯define_methodã§ååãã¤ãã¦ã¡ã½ããåããã¦ãããã¡ã½ãããªã®ã§returnãã¦ãæ§ããªãããåãSinatra::Baseã«å®ç¾©ããã¦ããpassã®ãããªã¡ã½ãããå¼ã¹ããã¨ããããã ã
ãã¤ã¾ããgetã¡ã½ããããã£ã¦ããã®ã¨åãããã«define_methodã使ãã°ãreturnåé¡ã¨passåé¡ã¯è§£æ±ºã§ãããgetãpostã¡ã½ããã¯routeã¨ããã¡ã½ãããå¼ã³åºãã¦ããã ãã§ãrouteã¡ã½ããããã£ã¦ãã主ãªå¦çã¯
- get/postã«æ¸¡ããpathæååãæ£è¦è¡¨ç¾ã«å¤æãã¦ãã®ååã§ãããã¯ãã¡ã½ããåããï¼ããã§define_methodã使ãããï¼
- routes['GET']ã¨ããååã®é åã«pathæååãæ£è¦è¡¨ç¾åãããã®ãå¼ã³åºãããæ¡ä»¶ãªã©ãpushãã
ãã®2ã¤ã§ãããããã§éè¦ãªã®ã¯pushã使ã£ã¦ãããã¤ã¾ãæ«å°¾ã«è¿½å ãã¦ããã¨ããäºã§ãããã«unshiftã使ãâ¦ã¨ãã£ã«ã¿ã®ç»é²é åºãé転ãã¦ãã¾ãã®ã§ãã¾ããããããªãããã¨ã«ããåã«pushããã®ã§ã¯ãªããã£ã«ã¿å¦çã®æ¹ãå
ã«å¼ã°ããããã«ç»é²ãã¦ããã°ãå®ç¾ã¯å¯è½ããã ã¨ããäºãåãã£ãã
ãã¨ãããã¨ã§ãRailsã®before_filterã¿ãããªã®ãSinatraã§å®ç¾ã§ããããã¨ããåãã«å¯¾ãã¦ã¯ãé å¼µãã°ã§ãããã ãã¨ããæ触ã§ããããã ãSinatraæ¬ä½ã®ã³ã¼ããããããã«å®ç¾ã§ãããã¯ã¾ã ã¡ãã£ã¨å¾®å¦ã§ãããã¾ããäºåã«å¼ã°ããã¹ããã£ã«ã¿ãå
ã«å¼ã°ããã¨ãããã¨ãpushã¨ãunshiftã¨ãã§ã´ãã§ã´ãã§ãã£ã¦ä¿è¨¼ãããã¨ããã®ã¯ã³ã¼ãã¨ãã¦æããã«çãæªãã®ã§ããã®ç¹ã«é¢ãã¦ãã¾ã æ¤è¨ãå¿
è¦ã ã
ãã¨ãããã§ãhaltã¨ããã¡ã½ãããã¿ã¤ãããããã使ãã°Sinatraæ¬ä½ã¯ããããã«å®å
¨ãªbefore_filterãå®ç¾ã§ãããã ããããã3æéãããSinatraã®ã³ã¼ãã°ã£ããçºãã¦ã¦ãããã飽ãã¦ããã®ã§ããã§çµãããç¶ãã¯ã¾ãæ¥é±ã