【Rails】別Viewへの移動方法

<h1>本投稿の目的</h1>
Railsの操作をメモするために議事録として書いていきます。

---
<h1>学習に使った教材</h1>
Udemyの ["はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/) を教材として使用しました。

---

<h1>①link_toの使い方</h1>

```ruby:qiita.rb
link_to 'リンク名', 'Prefix名 + _path'
```

・viewヘルパーという
・htmlを自動で作成してくれる (href作成をしてくれる)

○リンク名
⇨viewに文字列として表示したことを記述

○'Prefix名 + _path'
⇨rails routesのPrefixを使用する (_pathが必要)

---
<h3>【id付きURLパターン時の書き方】</h3>
・Prefixに紐づくURLパターンに着目
・URLパターンに :id のような一意に定められない変数が含まれることがある
・*(一意に定まる時は,上の記述のみでOK)

・この場合,'Prefix + _path + (each do | | で生成した値)' と記述
・each do | | で生成した値は,インスタンス変数から生成
・*(インスタンス変数はcontrollerで生成ずみの前提)

```ruby:qiita.rb
@インスタンス変数 each do |インスタンス名|
```
・このインスタンス名には,インスタンス変数の複数のキャッシュが格納されていく
・column名 =id となる値を URLパターンの :id へ変換
・urlの:idところに引数の:id を含んだ形で記述したことになる

例えば,

~~~
Prefix          URL Pattern
edit_question   question/:id/edit
~~~

・このPrefixに紐づくURLパターンには:idが含まれる
・そのため,(インスタンス名)も記述が必要

```ruby:qiita.rb
<% @question each do |question| %>
<%= link_to 'Edit', edit_question_path(question) %>
<% end %>
```

【解説】
・インスタンス名であるquestionには,[:id,:name,:title,:content]が格納されている
・この内,:id を自動で拾ってきてURLパターンに当てはめてくれる

---
<h3>【Prefixを使用しない書き方】</h3>
・link_toの第2引数にオブジェクト名を指定
・そのオブジェクトの:idをpathに含むURLへ自動でつなぐ
・:idを含むURLへのアクセスをlink_toで実行する場合はこの方法を使用

```ruby:qiita.rb
<% @question each do |question| %>
<%= link_to 'Edit', question %>
<% end %>
```
<h3>【deleteアクションへ直接接続】</h3>
・擬似的にDelteメソッドを再現するRailsの仕組みの一つ
・link_to の第3引数に method: :delete を追加
・htmlの属性にdata-method属性="delete"となる
・クリックで自動的に _method=delete　というパラメータを送信

```ruby:qiita.rb
<% @question each do |question| %>
<%= link_to 'Edit', question  ,method: :delete  %>
<% end %>
```

<h1>②redirect_toの使い方</h1>

```ruby:qiita.rb
ridirect_to 'Prefix名 + _path'
```
・指定したURLへ移動させるメソッド
・基本的に考え方は,①link_toメソッドと同じ
・違いは,Controller上に記載する
・そのため,viewへ表示しないので'リンク名'は不要
・また,URLパターンのPrefix時にはインスタンス変数そのものを使用可能
・(Class内で記載のためインスタンス変数 each do |インスタンス名| は不要)

---
<h3>【id付きURLパターン時の書き方】</h3>
```ruby:qiita.rb
  def アクション
    @インスタンス変数 = モデル名.find(params[:id])
    redirect_to question_path(@question)
  end
```
【解説】
・pramasnについては別途まとめるのハッシュ名だと思ってスルーしてください。
・@questionから :id を取得してURLパターンに当てはめてくれる

<h3>【一つ前の階層のpathへ戻る書き方】</h3>

```ruby:qiita.rb
redierct_to :back
```
・pathの一つ前の階層へredirectさせる
*(A/B/C → A/B にridirect)

<h1>③renderの使い方</h1>
```ruby:qiita.rb
render :htmlファイル名
```
・①②と同様にURLへ飛ばすメソッド
・注意点は,Prefixではなくhtmlファイルの名前を　:htmlファイル名 で指定
・基本的にアクション内で使用する
・アクション実行時の処理がfaulseした際に使用
・アクション実行条件のpathへアクセスする前のpathへ返す

```ruby:qiita.rb
  def アクション
    @インスタンス変数 = モデル名.find(params[:id])
    render :new
  end
```
<h1>④redirect_toとrenderの使われ方</h1>
・ここでは,PrefixでURLパターンが一意に定まる場合の例を説明

```ruby:qiita.rb
  def create
    @question = Question.new
    if @question.save
      redirect_to root_path, notice: 'Success!'
    else
      flash[:alert] = 'Save error!'
      render :new
    end
  end
```

【解説】
・アクション実行後に向かうURLを2つに分岐させる (redirect_to側 or render側 )
・@questionにQuestionモデルからインスタンス生成
・@question.saveで値を保持
・ここで正しく,値が保存できたら redirect_toのPrefixへ移動
・保存失敗時は, new.html.erb　　に戻る

○notice: 'Success!' 
⇨redirect_to後のURLにアクセス時にユーザーへ'Success!' と表示

○flash[:alert] = 'Save error!'
⇨戻されたview画面でユーザーへ'Save error!' と表示