1
0

More than 3 years have passed since last update.

Ruby on Railsのページの作成

Posted at

プログラミングの勉強日記

2020年7月14日 Progate Lv.196
Ruby on RailsⅢ

find_byメソッド

 find_byメソッドはある条件に合致するデータを取得できる。モデル名.find_by(カラム名: 値)とすることで、その値を持ったデータをデータベースから取得できる。今回は特定のidの投稿を取得するために使える。

ターミナル
$ rails console
  //idが3の投稿データを取得できる
> post=Post.find_by(id:3)
> post.content
=> "Rails勉強中"

URLにidを含める

 ルーティングのURL部分に:を用いてposts/:idと指定することでposts/1でもposts/2でもshowアクションにいくようにできる。

routes.rb
get "posts/index" => "posts#index"
get "posts/:id" => "posts#show"

 posts/:idのルーティングはposts/indexよりも下に書く。ルーティングは合致するURLを上から順に探すので、posts/indexより上に書くと、localhost:3000/posts/indexというURLがposts/:idに合致してしまう。

posts_controller.rb
def show
end

変数params

 コントローラのアクション内ではルーティングで設定したURLの:idの値を取得できる。その値はparamsという変数にハッシュとして入っている。params[:id]とすることでその値を取得できる。

posts_controller.rb
def show
  @id=params[:id]
end
posts/show.html.erb
<%=  id %>

ブラウザ(localhost:3000/posts/1):1 (と表示される)
ブラウザ(localhost:3000/posts/2) :2 (と表示される)

リンクの作成

 link_toメソッドを使う。link_toメソッドはRubyのコードで、第一引数に表示する文字を第二引数にURLを書くことでリンクを作成する。

posts/index.html.erb
<%# 変数展開を用いて投稿のidを指定 %>
<%= link_to(post.content, "/posts/#{post.id}") %>

投稿内容を受け取るアクションの用意

 フォームの投稿ボタンを押すとRails側に投稿データを送信できる。今回はcreateアクションを用意して受け取ったデータをデータベースに保存する。
 ルーティングを書くときにフォームの値を受け取る場合はpostとする。

routes.rb
get "posts/new" => "posts#new"
post "posts/create" => "posts#create"

 form_tagメソッドを用いるとフォームに入力されたデータを送信することができる。form_tagform_tag(送信先のURL) doのように送信先のURLを指定する。これによって、<input type="submit" ....>のボタンを押したときに指定されたURLにデータが送信される。

posts/new.html.erb
<% form_tag("/posts/create") do %>
  <textarea></textarea>
  <input type="submit" value="投稿">
<% end %>

リダイレクト

 他のURLに転送(リダイレクト)するには、redirect_toメソッドを用いる。redirect_to(URL)でそのページに転送することができる。

posts_controller.rb
def create
  redirect_to("/posts/index")
end

投稿内容の保存

 ①<textarea>タグにname属性を指定すると、入力データを送信することができるようになり、name属性の値をキーとしたハッシュがRails側に送られる。

posts/new.html.erb
<textareaname="content"></textarea>

 ②name属性を指定したフォームに入力されたデータはコントローラのアクション内で受け取れる。フォームのデータは変数paramsで受け取る。paramsはname属性に設定した文字列をキーとしたハッシュになっている。

controller.rb
def create
  params[:content]
end

 ③実際にデータベースに投稿を保存する。Postインスタンスを作成するときに、params[:content]を用いる。そのPostインスタンスを保存することで投稿機能ができる。

posts_controller.rb
def create
  @post=Post.new(content: params[:content])
  @post.save
  redirect_to("/posts/index")
end

投稿の並び替え

 orderメソッドを用いる投稿一覧を並び替えられる。order(カラム名:並び替えの順序)のように使う。並び替えの順番は昇順(:asc)と降順(desc)のどちらかを選択する。

contorller.rb
def index
  @post=Post.all.order(created_at: :desc)
end
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0