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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

924閲覧

Ruby on Railsのエラーに関して NoMethodError in Tasks#index

dal

総合スコア38

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/06/11 02:19

前提・実現したいこと

Ruby on RailsでToDoアプリを制作しています。初心者です。
index.html.erbにて、「TODOにする」「DONEにする」をクリックすると、データベースのフラグが切り替わり(0→1または1→0)、TODO一覧にあったタスクはDONE一覧へ、DONE一覧にあったタスクはTODO一覧へ切り替わるように動作させたいです。
patchでの処理実装が上手くいかず、立ち止まっています。

発生している問題・エラーメッセージ

NoMethodError in Tasks#index

Showing /home/ec2-user/environment/todo_app/app/views/tasks/index.html.erb where line #22 raised:

undefined method `toggle_status_task_path' for #<#Class:0x0000000236d678:0x007f3c0c01a0c8>

該当のソースコード

index.html.erb↓

ruby

1<% provide(:name, "作成") %> 2 3<p id="notice"><%= notice %></p> 4 5<h1>TODOアプリ</h1> 6<div class="index-page"> 7 <%= render 'form', task: @task %> 8 <div class="index-page__tasks"> 9 10 <div class="index-page__task-list"> 11 <h2>TODO</h2> 12 <div class="task-list"> 13 <% @task_todo.each do |task| %> 14 <div class="task-list__item task"> 15 <div class="task__name"><%= task.name %></div> 16 <div class="task__body"><%= task.body %></div> 17 <div class="task__buttons"> 18 <div class="task__edit"> 19 <%= link_to '編集', edit_task_path(task) %> 20 </div> 21 <div class="task__toggle"> 22 <%= link_to 'DONEにする', toggle_status_task_path(task), method: :patch %> 23 </div> 24 </div> 25 </div> 26 <% end %> 27 </div> 28 </div> 29 30 <div class="index-page__task-list"> 31 <h2>DONE</h2> 32 <div class="task-list"> 33 <% @task_done.each do |task| %> 34 <div class="task-list__item task"> 35 <div class="task__name"><%= task.name %></div> 36 <div class="task__body"><%= task.body %></div> 37 <div class="task__buttons"> 38 <div class="task__edit"> 39 <%= link_to '編集', edit_task_path(task) %> 40 </div> 41 <div class="task__toggle"> 42 <%= link_to 'TODOにする', toggle_status_task_path(task), method: :patch %> 43 </div> 44 </div> 45 </div> 46 <% end %> 47 </div> 48 </div> 49 </div> 50</div>

tasks_controller.rb↓

ruby

1class TasksController < ApplicationController 2 before_action :set_task, only: [:show, :edit, :update, :destroy] 3 4 # GET /tasks 5 # GET /tasks.json 6 def index 7 # @tasks = Task.all 8 @task_todo = Task.where(flag: 0) 9 @task_done = Task.where(flag: 1) 10 @task = Task.new 11 end 12 13 # GET /tasks/1 14 # GET /tasks/1.json 15 def show 16 end 17 18 # GET /tasks/new 19 def new 20 @task = Task.new 21 end 22 23 # GET /tasks/1/edit 24 def edit 25 end 26 27 # POST /tasks 28 # POST /tasks.json 29 def create 30 @task = Task.new(task_params) 31 32 respond_to do |format| 33 if @task.save 34 # format.html { redirect_to @task, notice: 'Task was successfully created.' } 35 format.html { redirect_to tasks_path, notice: 'success : 作成しました' } 36 format.json { render :show, status: :created, location: @task } 37 else 38 format.html { render :new } 39 format.json { render json: @task.errors, status: :unprocessable_entity } 40 end 41 end 42 end 43 44 # PATCH/PUT /tasks/1 45 # PATCH/PUT /tasks/1.json 46 def update 47 respond_to do |format| 48 if @task.update(task_params) 49 format.html { redirect_to tasks_path, notice: 'success : 更新しました' } 50 format.json { render :show, status: :ok, location: @task } 51 else 52 format.html { render :edit } 53 format.json { render json: @task.errors, status: :unprocessable_entity } 54 end 55 end 56 end 57 58 # DELETE /tasks/1 59 # DELETE /tasks/1.json 60 def destroy 61 @task.destroy 62 respond_to do |format| 63 format.html { redirect_to tasks_url, notice: 'Task was successfully destroyed.' } 64 format.json { head :no_content } 65 end 66 end 67 68 def toggle_status 69 @task = Task.find(params[:id]) 70 if @task.flag == 0 71 @task.update_attribute(:flag, 1) 72 else 73 @task.update_attribute(:flag, 0) 74 end 75 redirect_to tasks_path, notice: 'success : 更新しました' 76 end 77 78 private 79 # Use callbacks to share common setup or constraints between actions. 80 def set_task 81 @task = Task.find(params[:id]) 82 end 83 84 # Never trust parameters from the scary internet, only allow the white list through. 85 def task_params 86 params.require(:task).permit(:name, :body, :flag) 87 end 88 89end

routes.rb↓

ruby

1Rails.application.routes.draw do 2 resources :tasks 3 root 'tasks#index' 4 patch '/tasks/:id/toggle_status', to: 'tasks#toggle_status' 5end 6 7 8

試したこと

index.html.erbの
<%= link_to 'DONEにする', toggle_status_task_path(task), method: :patch %>
や、
<%= link_to 'TODOにする', toggle_status_task_path(task), method: :patch %>
にある、toggle_status_task_path(task)を edit_task_path(task)に変えると上手くいく(挙動はこれで良い)のですが、/tasks/:id/editではなく、/tasks/:id/toggle_statusでこの処理を行いたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コマンドラインからrake routes、あるいはブラウザから/rails/info/routesにアクセスして、ルートの一覧表を確認してみましょう。

URLとセットで、そこにアクセスするためのヘルパーメソッド名が明記されています。

投稿2018/06/11 02:27

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dal

2018/06/11 02:32

確認しました。 PATCH /tasks/:id/edit(.:format) tasks#toggle_status と表記されています。
maisumakun

2018/06/11 02:34 編集

同じ行の、PATCHの前にprefix(ヘルパーの名前のベースになる部分)が表示されますが、そこは空欄でしょうか。
dal

2018/06/11 02:40

空欄になってます。
dal

2018/06/11 02:52

試してみます。 また、はじめにアドバイスいただいた、rake routesの結果ですが、 PATCH /tasks/:id/edit(.:format) tasks#toggle_status の1行上が、 root GET / tasks#index になっています。これはPATCHのprefix部分がrootということなのでしょうか?
dal

2018/06/11 05:03

as: :toggle_status_taskを指定したら、求めていた動作になりました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問