일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 비즈니스일본어
- Web
- 디지몬
- メソッド
- 単語
- 건담
- ruby
- jsp
- java
- rails
- DART
- Spring
- Flutter
- nico
- html
- 반다이몰
- javascript
- 인프런
- rails7
- 자바
- springboot
- 日本語
- C로 시작하는 컴퓨터 프로그래밍4판
- 건담베이스
- 연습문제
- vscode
- 一日一つメソッド
- CSS
- 일본어
- Python
- Today
- Total
AR삽질러
初めてのRuby on Rails ミニQ&Aサイト開発 - 回答機能Controller, createAction, destroyAction(7) 본문
初めてのRuby on Rails ミニQ&Aサイト開発 - 回答機能Controller, createAction, destroyAction(7)
아랑팡팡 2024. 1. 5. 14:59
初めてのRuby on Rails ミニQ&Aサイト開発 - 回答機能Controller, Action(7)
routes.rb
Rails.application.routes.draw do
root "questions#index"
resources :questions
resources :questions do
resources :answers
end
end
root "questions#index"
- ルートURL '/' に接続して時 QuestionsControllerのindexアクションを呼び出す。
resources :questions
- RESTfulラウトを自動に生成する。
resources :questions do resources :answers
- questions/:question_id/answers 形態の重複ルートを生成し、各回答が特定の質問に関連付けられていることを示す。
controller作成
rails g controller Answers
create app/controllers/answers_controller.rb
invoke erb
create app/views/answers
invoke test_unit
create test/controllers/answers_controller_test.rb
invoke helper
create app/helpers/answers_helper.rb
invoke test_unit
1. create
answers_controller.rb
class AnswersController < ApplicationController
# 回答の登録
def create
# p params
@question = Question.find(params[:question_id])
@question.answers.create(answer_params)
redirect_to question_path(@question)
end
private
def answer_params
params.require(:answer).permit(:name, :content)
end
end
createアクション
- 特定の質問 ( @question )に対する新しい返事を生成する。answer_paramsメソッドを通じてフィルタリングされたパラメータを使って返事を生成する。
redirect_to question_path(@question)
- 返事を生成し、ユーザーを該当する返事の詳細パージにリダイレクションする。
show.html.erb
<h1>Show</h1>
<p>
Title :
<%= @question.title %><br>
</p>
<p>
Name :
<%= @question.name %><br>
</p>
<p>
Content :
<%= @question.content %><br>
</p>
<h2>Answers</h2>
<% @question.answers.each do |answer| %>
<p>
Name :<br>
<%= answer.name %>
</p>
<p>
Content :<br>
<%= answer.content %>
</p>
<% end %>
<h2>Add a answer</h2>
<%= form_with model: [@question, @question.answers.build] do |form| %>
<div>
<%= form.label :name %><br>
<%= form.text_field :name %>
</div>
<div>
<%= form.label :content %><br>
<%= form.text_area :content %>
</div>
<div>
<%= form.submit %>
</div>
<% end %><br>
<%= link_to 'top', questions_path %>
form_with model: [@question, @quesion.answer.build]で新しい返事を生成する。このFormは AnswersControllerの createアクションにデータを送信する。
ユーザーがFormを提出したら、createアクションは新しい返事を生成し、質問の詳細パージにリダイレクションする。
2. destroy
show.html.erb
<h1>Show</h1>
<p>
Title :
<%= @question.title %><br>
</p>
<p>
Name :
<%= @question.name %><br>
</p>
<p>
Content :
<%= @question.content %><br>
</p>
<h2>Answers</h2>
<% @question.answers.each do |answer| %>
<p>
Name :<br>
<%= answer.name %>
</p>
<p>
Content :<br>
<%= answer.content %>
</p>
<p>
<%= link_to 'Destroy Anser', [answer.question, answer], data: { turbo_method: 'delete', turbo_confirm: 'Ary you sure?'} %>
</p>
<% end %>
<h2>Add a answer</h2>
<%= form_with model: [@question, @question.answers.build] do |form| %>
<div>
<%= form.label :name %><br>
<%= form.text_field :name %>
</div>
<div>
<%= form.label :content %><br>
<%= form.text_area :content %>
</div>
<div>
<%= form.submit %>
</div>
<% end %><br>
<%= link_to 'top', questions_path %>
各返事に link_toヘルパーを使って、削除リンクを生成する。
リンクは AnswerControllerの destroyアクションに紐つけており、turbo_method: 'delete'オプションでHTTP DELETE要請をする。
turbo_confirm: 'Are you sure?' オプションでユーザーがリンクをクリックしたときの再確認をする。
answers_controller.rb
class AnswersController < ApplicationController
# 回答の削除
def destroy
@question = Question.find(params[:question_id])
@answer = @question.answers.find(params[:id])
@answer.destroy
redirect_to @question, status: :see_other
end
private
def answer_params
params.require(:answer).permit(:name, :content)
end
end
destroyアクション
- @questionに属している @answerを探して削除する。
- @question = Question.find(params[:question_id]) は質問の中に属しているURLで idに該当する質問を探す。
- @answer = @question.answers.find(params[:id]) は質問に属している返事の中でURLで idに該当する返事を探す。
- @answer.destroy は該当する質問をDataBaseから削除する。
- redirect_to @question, status: :see_other は削除した後、質問の詳細ページにリダイレクトする、この時、status: :see_otherはHTTP 状態コード303を使ってレダイレクトする
https://github.com/designAR/rails_board/tree/answer_controller_%2307
'Ruby > RubyOnRails-日本語' 카테고리의 다른 글
Rails 一日一つメソッド (Day17) respond_toメソッド (0) | 2024.01.08 |
---|---|
Rails 一日一つメソッド (Day16) resourcesメソッド (0) | 2024.01.05 |
初めてのRuby on Rails ミニQ&Aサイト開発 - 改善、回答機能(6) (0) | 2024.01.05 |
Rails 一日一つメソッド (Day15) form_withメソッド (0) | 2024.01.04 |
初めてのRuby on Rails ミニQ&Aサイト開発 - delete, destroy 削除(5) (0) | 2024.01.04 |