本投稿の目的
Railsの操作をメモするために議事録として書いていきます。学習に使った教材
Udemyの ["はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/) を教材として使用しました。①link_toの使い方
link_to 'リンク名', 'Prefix名 + _path'
・viewヘルパーという
・htmlを自動で作成してくれる (href作成をしてくれる)
○リンク名
⇨viewに文字列として表示したことを記述
○'Prefix名 + _path'
⇨rails routesのPrefixを使用する (_pathが必要)
【id付きURLパターン時の書き方】
・Prefixに紐づくURLパターンに着目 ・URLパターンに :id のような一意に定められない変数が含まれることがある ・*(一意に定まる時は,上の記述のみでOK)・この場合,'Prefix + _path + (each do | | で生成した値)' と記述
・each do | | で生成した値は,インスタンス変数から生成
・*(インスタンス変数はcontrollerで生成ずみの前提)
@インスタンス変数 each do |インスタンス名|
・このインスタンス名には,インスタンス変数の複数のキャッシュが格納されていく
・column名 =id となる値を URLパターンの :id へ変換
・urlの:idところに引数の:id を含んだ形で記述したことになる
例えば,
Prefix URL Pattern
edit_question question/:id/edit
・このPrefixに紐づくURLパターンには:idが含まれる
・そのため,(インスタンス名)も記述が必要
<% @question each do |question| %>
<%= link_to 'Edit', edit_question_path(question) %>
<% end %>
【解説】
・インスタンス名であるquestionには,[:id,:name,:title,:content]が格納されている
・この内,:id を自動で拾ってきてURLパターンに当てはめてくれる
【Prefixを使用しない書き方】
・link_toの第2引数にオブジェクト名を指定 ・そのオブジェクトの:idをpathに含むURLへ自動でつなぐ ・:idを含むURLへのアクセスをlink_toで実行する場合はこの方法を使用<% @question each do |question| %>
<%= link_to 'Edit', question %>
<% end %>
【deleteアクションへ直接接続】
・擬似的にDelteメソッドを再現するRailsの仕組みの一つ ・link_to の第3引数に method: :delete を追加 ・htmlの属性にdata-method属性="delete"となる ・クリックで自動的に _method=delete というパラメータを送信<% @question each do |question| %>
<%= link_to 'Edit', question ,method: :delete %>
<% end %>
②redirect_toの使い方
ridirect_to 'Prefix名 + _path'
・指定したURLへ移動させるメソッド
・基本的に考え方は,①link_toメソッドと同じ
・違いは,Controller上に記載する
・そのため,viewへ表示しないので'リンク名'は不要
・また,URLパターンのPrefix時にはインスタンス変数そのものを使用可能
・(Class内で記載のためインスタンス変数 each do |インスタンス名| は不要)
【id付きURLパターン時の書き方】
```ruby:qiita.rb def アクション @インスタンス変数 = モデル名.find(params[:id]) redirect_to question_path(@question) end ``` 【解説】 ・pramasnについては別途まとめるのハッシュ名だと思ってスルーしてください。 ・@questionから :id を取得してURLパターンに当てはめてくれる【一つ前の階層のpathへ戻る書き方】
redierct_to :back
・pathの一つ前の階層へredirectさせる
*(A/B/C → A/B にridirect)
③renderの使い方
```ruby:qiita.rb render :htmlファイル名 ``` ・①②と同様にURLへ飛ばすメソッド ・注意点は,Prefixではなくhtmlファイルの名前を :htmlファイル名 で指定 ・基本的にアクション内で使用する ・アクション実行時の処理がfaulseした際に使用 ・アクション実行条件のpathへアクセスする前のpathへ返す def アクション
@インスタンス変数 = モデル名.find(params[:id])
render :new
end
④redirect_toとrenderの使われ方
・ここでは,PrefixでURLパターンが一意に定まる場合の例を説明 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!' と表示