l'essentiel est invisible pour les yeux

Saturday, March 10, 2007

[Rails] 携帯からのリクエストの際に呼び出すアクションを切り替える

Mobile on Railsでは、携帯からのリクエストの時には、#{RAILS_ROOT}/app/views_mobile/以下からテンプレートを読み込みますが、呼び出すアクションも変更したい時があるのでアクションの切り替えを試しに実装してみました。

携帯からのリクエストの際の仕様

  • __mobile_#{action_name}というメソッドがコントローラ内に定義されている場合はそちらを呼び出す。
  • __mobile_#{action_name}を呼び出した際もviewのテンプレートパスは通常通り#{RAILS_ROOT}/app/views_mobile/#{action_name}.rhtml
  • __mobile_#{action_name}が定義されていない際は、action_nameが呼び出される。

携帯からのリクエストの際に別のアクションを実行したい場合のみ、__mobile_#{action_name}を定義することでそちらのアクションが実行されます。定義しない際は通常のアクションが呼び出され、携帯用のviewが表示されます。

インストール方法

% ./script/plugin install -x http://shindaita.stiq.net/svn/mobile_on_rails/trunk/mobile_on_rails/


変更箇所は、コントローラのActionController::Base#perform_actionとActionView::Base.full_template_path.


Index: mobile_on_rails/lib/mobile/controller.rb
===================================================================
--- mobile_on_rails/lib/mobile/controller.rb (revision 166)
+++ mobile_on_rails/lib/mobile/controller.rb (working copy)
@@ -7,15 +7,27 @@
module ActionController #:nodoc:
# This module is offer fixtures for perform request from mobile.
module Mobile
+ # prefix which is add action method name when request is from mobile
+ PREFIX_OF_REQUEST_FROM_MOBILE = "__mobile_"
+
def self.included(base)
base.class_eval do
after_filter :after_filter_for_mobile
before_filter :before_filter_for_mobile
alias_method_chain :rewrite_options, :session_id
+ alias_method_chain :perform_action, :mobile
end
end

protected
+ def perform_action_with_mobile
+ if request && request.mobile?
+ _action_name = "#{PREFIX_OF_REQUEST_FROM_MOBILE}#{@action_name}"
+ @action_name = _action_name if self.class.action_methods.include?(_action_name)
+ end
+ perform_action_without_mobile
+ end
+



--- mobile_on_rails/lib/mobile/view.rb (revision 166)
+++ mobile_on_rails/lib/mobile/view.rb (working copy)
@@ -3,7 +3,8 @@
protected
def full_template_path_with_mobile(template_path, extension)
if controller.kind_of?(ActionController::Base) && controller.request.mobile?
- full_template_path_without_mobile("../views_mobile/#{template_path}", extension)
+ _template_path = template_path.sub('/__mobile_', '/')
+ full_template_path_without_mobile("../views_mobile/#{_template_path}", extension)
else
full_template_path_without_mobile(template_path, extension)
end

Mobile on Railsでぐぐってもこのブログが全くヒットしないのが面白い。
ξ;゜ー゜)ξ { 遅レス。強し。