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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

1回答

3152閲覧

Railsで「受付中」「解決済み」の表示を切り替えるボタンをAjaxで作成

riamk

総合スコア47

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/04/12 09:19

###前提・実現したいこと
Rails 4

練習で簡単なQ&Aサイトを作っていて、質問したユーザーが回答を「受付中」「解決済み」の項目を切り替えられるボタンのようなものを作りたいです。

現在questionsテーブルに is_solved カラムをbooleanで作成してボタンを作成しようと試みています。

###発生している問題・エラーメッセージ
現在こちら
https://teratail.com/questions/72211
を参考に一通り実装し終わったのですが、_make_resolved.html.erb の記述でエラーになってしまいます。

エラーメッセージはこのように表示されます。

SyntaxError in QuestionsController#show views/questions/_make_resolved.html.erb:1: syntax error, unexpected ')', expecting => ...stions,action: :make_resolved}) );@output_buffer.safe_append... ... ^ views/questions/_make_resolved.html.erb:3: syntax error, unexpected keyword_ensure, expecting ')' views/questions/_make_resolved.html.erb:5: syntax error, unexpected keyword_end, expecting ')' Extracted source (around line #1): 1 <%= link_to(question.is_solved '解決済み':'受付中',{controller: questions,action: :make_resolved}) %>

###該当のソースコード

questions_controller.rb

ruby

1class QuestionsController < ApplicationController 2 respond_to :js 3 4# 省略 5 6 def show 7 @question = Question.find(params[:id]) 8 end 9 10 def make_resolved 11 @question == Question.find(params[:question_id]) 12 if @question.update(is_solved: true) 13 // 14 end 15 respond_to |format| 16 format.html{render show} 17 format.js{} 18 end 19 20# 省略 21 22end

views/questions/show.html.erb

ruby

1# 省略 2 3<div id='ajax_button'> 4 <%= render :partial=>'make_resolved' , question: @question %> 5</div>

views/questions/_make_resolved.html.erb

ruby

1<%= link_to(question.is_solved '解決済み':'受付中',{controller: questions,action: :make_resolved}) %>

views/questions/make_resolved.js.erb

ruby

1$("#ajax_button").children().remove(); 2$("#ajax_button").append('<%= escape_javascript render :partial => "make_resolved" ,locals: {question: @question},:layout => false %>');

現在このように記述しています。
どのように修正すればいいかご教授頂けると嬉しいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

localsが抜けてます。

ruby

1<div id='ajax_button'> 2 <%= render :partial=>'make_resolved' , locals: {question: @question} %> 3</div>

ごめんなさい私が不注意でした。
?が抜けてました。
questionsがシンボルになってません。

ruby

1<%= link_to(question.is_solved ? '解決済み':'受付中',{controller: :questions,action: :make_resolved}) %>

このshowもシンボルになってませんね。

ruby

1def make_resolved 2 @question == Question.find(params[:question_id]) 3 if @question.update(is_solved: true) 4 // 5 end 6 respond_to |format| 7 format.html{render :show} 8 format.js{} 9 end 10

投稿2017/04/12 09:24

編集2017/04/12 09:30
moke

総合スコア2241

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

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

riamk

2017/04/12 09:41

訂正からご教授までありがとうございます。 mokeさんのご教授の元、修正してshowにアクセスしてみたところ ActionController::UrlGenerationError in Questions#show Showing /app/views/questions/_make_resolved.html.erb where line #1 raised: No route matches {:action=>"make_resolved", :controller=>"questions", :id=>"1"} とエラーになってしまうのですが、これは何が原因なのでしょうか?
moke

2017/04/12 09:53 編集

それは、routeが設定されていないことによる問題です。 (make_resolvedへのアクセス権限の設定と思ってください) 本当は、私の前の質問者が答えるべきだったんですが。 config/route.rbに get 'questions/make_resolved'=>'questions#make_resolved' と追記してください。 resources: :questionsより上に書かないと誤作動する可能性があります
riamk

2017/04/12 10:08

コントローラーでmake_resolvedを作成したので、それに対するrouteの設定が必要だったのですね! ありがとうございます。 無事にshowページが表示できたのですが、受付中のリンクを押すと ActiveRecord::RecordNotFound in QuestionsController#make_resolved Couldn't find Question with 'id'= とidが見つからない?とエラーになります。 コントローラーの記述で @question = Question.find(params[:question_id]) この部分は何か修正が必要なのでしょうか? 質問ばかりになってしまって申し訳ございません。
moke

2017/04/12 10:18 編集

Question.find(params[:id]) でいいと思います。今の所は もしくは、{question_id: @question.id}をlink_toに含めて下さい
riamk

2017/04/12 10:29

ありがとうございます。 {question_id: @question.id}をlink_toに含めて試してもみましたが、同じエラーが変わらず出てしまいます。 一旦、整理して新たに質問を立てた方がよろしいでしょうか?
moke

2017/04/12 11:42

携帯なんですよ、すみません{:controller}このくだりに追記する形で
riamk

2017/04/13 02:13

{:controller}このくだりに追記する形というのは <%= link_to(question.is_solved ? '解決済み':'受付中',{controller: :questions,action: :make_resolved, question_id: @question.id}) %> こういうことで合っていますでしょうか? ちなみに、このように記述してもエラーが出てしまいました。
moke

2017/04/13 02:51 編集

さらに、{remote: true}も足し混んでみてください。これでajax化の方が動きます。 エラーがでた、ではなくてエラーをコピペして貼り付けてくだされば お答えできるのですが…。
riamk

2017/04/13 04:14

<%= link_to(question.is_solved ? '解決済み':'受付中',{controller: :questions,action: :make_resolved, question_id: @question.id, remote: true}) %> として、{remote: true}も足し混んで試みてみました。 すると、クリックしても何も動かずエラーは出なかったのでログを見てみると ActiveRecord::RecordNotFound (Couldn't find Question with 'id'=): app/controllers/questions_controller.rb:22:in `make_resolved' とこのようなエラーが出ていました。
moke

2017/04/13 04:30 編集

一応確認しますが Question.find(params[:id])に変えるか または Question.find(params[:question_id])のまま {question_id: @question.id}をlink_toに含めて下さい という意味なんですが両方やってたらあわやですよ
riamk

2017/04/13 05:58

ご指摘ありがとうございます。 mokeさんの仰る通り両方やってしまっていました。 Question.find(params[:question_id])のまま {question_id: @question.id}をlink_toに含めてやってみたら クリックして動かず以下のエラーが発生 ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/questions_controller.rb:26:in `make_resolved' しかし画面をリロードしてみると 受付中から解決済みに表示変わっている。 という状況です。
moke

2017/04/13 08:59

:show を"show" に書き換えてみて下さい
riamk

2017/04/13 15:07

"show"に書き換える部分はコントローラーの format.html{render :show} の部分で合っていますでしょうか? そこの部分を "show" に書き換えて実行してみたのですが ActionController::UnknownFormat (ActionController::UnknownFormat): app/controllers/questions_controller.rb:26:in `make_resolved' こちらのエラーが引き続き表示されてしまいます。
riamk

2017/04/13 15:15

解決することができました! respond_to |format| ・・・ ここの部分を respond_to do |format| ・・・ end とすることで解決できました。 解決できるまで誠実にご回答して頂きありがとうございました! まだまだ未熟者で分からないことばかりですが、これからも頑張って学んでいこうと思うので、機会があればまたご教授頂けると嬉しいです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問