scaffoldで出来上がるのは、
index、show、new、edit、create、update、destroy。
上記以外のmethodを用意して実行したい。
ManagementsテーブルのStartTimesカラムに現在時刻を突っ込みたい。
update_attributeで特定のカラムの値を更新するmethodを新しく用意した。
controllers/managements_controller.rb (サンプル)
# GET /managements # GET /managements.json def index @managements = Management.all respond_to do |format| format.html # index.html.erb format.json { render json: @managements } end end def attr_update_time # 追加メソッド now = Time.now @management = Management.find(params[:id]) @management.update_attribute(:start_time,now) redirect_to ({action: "index"}), notice: "Start Time was successfully updated" end
views/managements/index.html.erb(サンプル)
<% @managements.each do |management| %> <%= management.start_time.strftime("%H:%M") %> <%= link_to 'START',:action => :attr_update_time, :id => management %> <% end %>
悲しい結果となる。
Routing Error
エラーログ
No route matches [POST] "/assets"
Try running rake routes for more information on available routes.
Started POST "/assets?action=attr_update_time&controller=managements&id=1" for 127.0.0.1 at 2012-05-17 21:59:44 +0900 ActionController::RoutingError (No route matches [POST] "/assets"): config/initializers/quiet_assets.rb:6:in `call_with_quiet_assets' Rendered /home/username/.rvm/gems/ruby-1.9.3-head@rails3/gems/actionpack-3.2.3/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (10.1ms)
config/routes.rbをざっと見直したところ…最終行のendの上、
〜省略〜 # This is a legacy wild controller route that's not recommended for RESTful applications. # Note: This route will make all actions in every controller accessible via GET requests. # match ':controller(/:action(/:id))(.:format)' end
コメントアウトをはずしてサーバー再起動後、動作OK。
〜省略〜 # This is a legacy wild controller route that's not recommended for RESTful applications. # Note: This route will make all actions in every controller accessible via GET requests. match ':controller(/:action(/:id))(.:format)' end
基本だったか。こんなのはAjaxで始末してやりたいところだ。
追記:これって非RESTfulなインターフェースじゃねーか。
ルーティングちゃ〜んと勉強しよね。