質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Ruby

    9443questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    8864questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2544questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

railsにおけるformタグ内のアクションの分け方について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,445

palpal

score 12

Ruby on Rail(verは4.2.5です)に関して質問です。

現在練習がてら、画像とタイトル、説明文を投稿して一覧表示できる簡単なアプリケーションを作成しています。

アプリ内の機能として、不要な写真を選択して一括削除する機能を設けようと思っているのですが苦戦しています。

内容としては以下のようにform_tagで囲った一覧表示部分を作成し、Buttonによってそれぞれ処理をわけたいと思ったのですが、何故かこの方法だと2行目にある最初の「+写真を追加」ボタンだけ、押下するとindexアクションが呼び出されてしまいます。(「-写真を削除」ボタンはしっかりとselecteddestoryアクションが呼び出されているようです)

<%= form_tag do %>
    <%= button_to "+写真を追加", new_photo_path,method: :get, class:"btn btn-success" %>
    <%= button_to "ー写真を削除", 'photos/selecteddestroy', method: :post, class:"btn btn-danger" %>

<% @photos.each do |photo| %>
  <%= link_to image_tag(photo.image_url, alt:photo.title, class:"img-responsive"), photo if photo.image.present? %>
  <%= photo.title %>
  <%= check_box_tag "photo[][delete_check]", true, photo.delete_check %>
  <%= link_to '削除', photo, method: :selected, data:{confirm:'削除しますか?'} %>
<% end %>

<% end %>

PHPの場合こういった場合はとりあえずFromタグで囲って、あとはjsでアクションを動的に変化させていたのですが、railsの場合はどのように書くのがセオリーなのでしょうか。

お手数ですが教えてください。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

new_photo_pathがphotoコントローラのindexアクションを指定してるURLのエイリアスになっている可能性があるため,以下のいずれかでconfig/routes.rbでnew_photo_pathに設定されているURLとコントローラとアクションが正しいか確認してください。

routesの確認方法

もし正しく設定されていない場合はphotoモデルがrails gコマンドで実装されていれば,resourcesメソッドでのルーティング設定によって自動的に生成されます。
もし正しく設定されているのにもかかわらずindexが呼ばれる場合は,routesで設定したアクションをコントローラに定義し忘れている可能性もしくはindexにリダイレクトしている可能性があります。
どちらでもなければphoto_controller.rbの記述とconfig/routes.rbの中身を確認させていただければと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/04 22:56

    回答ありがとうございます。
    routeはあっているかと思います。(念のためこのコメントの下記に記載しています。)
    不思議なのは下記のように同じタグを二つずつけて書くと、上はcreateメソッド(すいません。説明ではindexと書きましたがcreateの間違いです)が、下はしっかりとnewメソッドが呼ばれます。

    <%= form_tag do %>
    <%= button_to "+写真を追加", new_photo_path,method: :get, class:"btn btn-success" %>
    <%= button_to "+写真を追加", new_photo_path,method: :get, class:"btn btn-success" %>

    以後、同じタグを書いても指定したメソッドが呼ばれるのですが、最初にあるボタンだけ必ずcreateメソッドが呼ばれてしまいます。

    何かrouteではないところに原因があるのでしょうか。


    route.rb
    ----------------------------------------------------------------------------------------
    match '/photos/update_all'=> 'photos#update_all', via: [:get,:post]
    match '/photos/confirm_all'=> 'photos#confirm_all',via:[:get, :post]
    match '/photos/edit_all'=> 'photos#edit_all',as:'edit_all_photo',via:[:get,:post]
    resources :photos
    resources :albums
    ----------------------------------------------------------------------------------------


    photo_controller.rb
    ----------------------------------------------------------------------------------------
    class PhotosController < ApplicationController
    before_action :set_photo, only: [:show, :edit, :update, :destroy]

    # GET /photos
    # GET /photos.json
    def index
    @photos = Photo.all
    session[:photos]=@photos

    respond_to do |format|
    format.html #index.html.erb
    format.json{render json:@photos}
    end
    end

    # GET /photos/1
    # GET /photos/1.json
    def show
    end

    # GET /photos/new
    def new
    @photo = Photo.new
    end

    # GET /photos/1/edit
    def edit
    end

    # POST /photos
    # POST /photos.json
    def create
    @photo = Photo.new(photo_params)

    respond_to do |format|
    if @photo.save
    format.html { redirect_to @photo, notice: 'Photo was successfully created.' }
    format.json { render :show, status: :created, location: @photo }
    else
    format.html { render :new }
    format.json { render json: @photo.errors, status: :unprocessable_entity }
    end
    end
    end

    # PATCH/PUT /photos/1
    # PATCH/PUT /photos/1.json
    def update
    respond_to do |format|
    if @photo.update(photo_params)
    format.html { redirect_to @photo, notice: 'Photo was successfully updated.' }
    format.json { render :show, status: :ok, location: @photo }
    else
    format.html { render :edit }
    format.json { render json: @photo.errors, status: :unprocessable_entity }
    end
    end
    end

    # DELETE /photos/1
    # DELETE /photos/1.json
    def destroy
    @photo.destroy
    respond_to do |format|
    format.html { redirect_to photos_url, notice: 'Photo was successfully destroyed.' }
    format.json { head :no_content }
    end
    end

    #GET /photos/edit_all
    def edit_all
    @photos=session[:photos]
    end

    #GET /photos/confirm_all
    def confirm_all
    @photos=Array.new
    params.require(:photos).each do |photo|
    updated_photo=Photo.find(photo["id"])
    updated_photo.update(photo.permit(:title,:memory))
    @photos << updated_photo
    end
    session[:photos]=@photos
    end

    #GET /photos/update_all
    def update_all

    respond_to do |format|
    format.html { redirect_to photos_url, notice: '更新しました' }
    format.json { head :no_content }
    end
    end

    private
    # Use callbacks to share common setup or constraints between actions.
    def set_photo
    @photo = Photo.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def photo_params
    params.require(:photo).permit(:image, :title, :memory, :agreement)
    end
    end
    ----------------------------------------------------------------------------------------

    キャンセル

  • 2016/01/13 21:58 編集

    ご返信遅くなって申し訳ないです。
    form_tagの中にbuttonが入っていてPOSTメソッドでリダイレクトがかかっているのではないでしょうか。
    form内のsubmitでのリクエストはPOSTで送信されます。
    resourcesメソッドで生成されるpathはnewアクションがget,createアクションがPOSTで実行されていたと思います。

    キャンセル

同じタグがついた質問を見る

  • Ruby

    9443questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    8864questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2544questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。