雑記

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|
2007|01|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|09|11|
2009|02|03|05|06|07|08|10|11|12|
2010|01|03|04|05|06|07|08|09|10|
2011|05|06|09|10|
2012|03|07|09|12|
2013|01|02|04|05|07|08|10|11|
2014|04|05|08|10|12|
2015|01|05|
2016|09|

2006-02-16

やわらか戦車(続き)

とうとうこんなことに。

ところで、作者のサイトWEBTENTはもうご覧になりましたでしょうか。「くわがたツマミ」「コアラッコの歌」「カレーパンのうた」あたりはお勧めです。

使い捨て指輪リングヒルズ

「今、渋谷・原宿ギャルの間で大ブレイク中!」だそうです。

最近こんなんばっかりや。


2009-02-16

[Rails] 「1つのフォームで複数のsubmitボタン」をちょっとエレガント(?)に

[03/06 追記] flash.keep を追加してフラッシュエントリも保持するように修正

あるデータを表示して、それを確定するか破棄するか選択するようなアプリケーションを考える。

コントローラのメソッドは以下のような感じ。

  show -+- commit
        |
        +- reject

app/controller/application.rb に以下の2メソッドを追加

 # submit ボタンのリダイレクト
 def redirect_to_submit_action
   raise if params[:submit].size != 1
   session[:stored_params] ||= Hash.new
   params[:orig_action] = params[:action]
   params[:action] = params[:submit].keys.first
   h = params.hash.to_s
   session[:stored_params][h] = params
   flash.keep
   redirect_to :action => params[:action], :id => params[:id], :k => h
 rescue
   session[:stored_params].delete(h) if h
   render :text => '<p>Redirect error</p>', :layout => 'application'
   return false
 end

 # パラメータの復元
 def recover_params
   h = params[:k] or return false
   if session[:stored_params] && session[:stored_params][h]
     params.replace(session[:stored_params][h])
     session[:stored_params].delete(h)
   end
 end

redirect_to_submit_actionでのredirectを、単に

   redirect_to params

のように書いてしまっても一応動くが、その場合ブラウザのロケーションバーに他のパラメータがずらずらと並んでしまい、よろしくない。

対象となるコントローラでは次のようにフィルタを設定する。

 class FooController < ApplicationController
    before_filter :recover_params, :only => [ :commit, :reject ]
    before_filter :redirect_to_submit_action, :only => :dummy_redirect
  :
    def commit
       # commit 処理
    end

    def reject
       # reject 処理
    end
 end

app/view/foo/show.rhtml のフォームでは:action に dummy_redirectを指定する。

 <%- form_tag :action => 'dummy_redirect' do -%>
   :
 <%= submit_tag '確定', :name => 'submit[commit]' %>
 /
 <%= submit_tag '破棄', :name => 'submit[reject]' %>
 <%- end -%>

これで、[確定]ボタンをクリックすればcommitが、[破棄]ボタンをクリックするとrejectが呼ばれる。