maehachi08 Anything Blog

2013年12月20日
Rails form_forの中でsubmitボタンを複数用意してボタンごとに処理を分ける

Webページを書いてて、編集画面のフォーム内で"更新"ボタンと"削除"ボタン(またはキャンセルボタンとか)を並列配置したいことがあります。

ネットで調べるとjsを使った実装方法が載ってるんですが、railsコードだけで実装する方法がないかと調べたら見つかりました!!忘れそうなので、備忘録がてらメモメモ。

実装の概要

実装方法としてはHTMLのinputタグで付けることができる属性であるname属性を使用します。

たとえば以下のHTMLコードだとname属性に"update"を指定しています。

<input class="button_edit_menu" id="blog_name_submit" name="update" type="submit" value="Update Tag")

このname属性をERBコードの中でも指定できます。

<%= f.submit 'Update Tag', :name => 'update' %>

このname属性が指定されているかどうかをコントローラーのアクション内で判断してname属性有無で処理を分岐させます。コントローラーのアクション内でname属性有無を判断するのは、params[:属性名]の真偽で判断できます。

if params[:update]

  # name属性"update"が指定されている場合の処理
  anything

end 

ってことで実際の実装コード

ビュー内のERB

  <%= form_for @tag,
    :url  => { :action => 'tag_update', :tag_id => @tag.id },
    :html => { :method => :put } do |tag| %>

        <%= tag.text_area :blog_name, :value => @tag.name, :cols => 20, :rows => 1 %>

        <%= tag.submit 'Update Tag', :name => 'update' %>

        <%= tag.submit 'Delete Tag', :confirm => "#{@tag.name} を削除しますか?", :name    => 'delete' %>

  <% end %>

コントローラ内の処理

    if params[:update]
      update_tag = Tag.find( params[:tag_id] )
      update_tag.update_attributes( :name => params[:tag][:name] )
    elsif params[:delete]
      destroy_tag = Tag.find( params[:tag_id] )
      destroy_tag.destroy
    end