find_byメソッド
ある条件に合致するデータを取得することができる
post=Post.find_by(id:3) #中略 post.content
id
- 「posts/:id」と書くと「/posts/◯◯」のような全てのURLが該当
- 「posts/:id」というルーティングは「posts/index」より下に書かなければいけない
- ルーティングは合致するURLを上から順に探すため、「posts/index」よりも上に書くと、「localhost:3000/posts/index」というURLは「posts/:id」というルーティングに合致してしまう
params[:id]
- コントローラのアクション内では、ルーティングで設定したURLの「:id」の値を取得することができる
- 値はparamsという変数にハッシュとして入っている
- params[:id]とすることで、その値を取得することができる
def show @id=params[:id] end
params[:id]を使ってデータ取得
def show @post=Post.find_by(id:params[:id]) end
<div class="main posts-show"> <div class="container"> <div class="posts-show-item"> <p> <%= @post.content %> </p> <div class="post-time"> <%= @post.created_at %> </div> </div> </div> </div>
link_toメソッドで各投稿へのリンク作成
便利っすね。意義が分かってきたぞ。
<div class="container"> <% @posts.each do |post| %> <div class="posts-index-item"> <%= link_to(post.content,"/posts/#{post.id}") %> </div> <% end %> </div>
post
- ルーティングを書く際に「get」と書いてきたが、createアクションのようにデータベースに変更を加える場合は「post」とする必要がある
- form_tagメソッドを用いると、フォームに入力されたデータを送信することができる・・・form_tag(送信先のURL) do
- redirect_toは「redirect_to(URL)」とすることで、そのページに転送することができる
post "posts/create" => "posts#create"
name属性からのparams
- textareaタグにname属性を指定すると、入力データを送信することができるようになり、name属性の値をキーとしたハッシュがRails側に送られる
- name属性を指定したフォームに入力されたデータは、コントローラのアクション内で受け取ることが可能になる
- フォームのデータは、変数paramsで受け取る。
- paramsはname属性に設定した文字列をキーとしたハッシュになっている
- 実際に保存するには、Postインスタンスを作成する際にparams[:content]を用いる。そのPostインスタンスを保存することで投稿機能の完成。
- params・・・①「:○○」を使ったルーティングのURLから値を取得する ②「name="○○"」が付いたフォームの入力内容を受け取る
def create @post=Post.new(content:params[:content]) @post.save redirect_to("/posts/index") end
<%= form_tag("/posts/create") do %> <div class="form"> <div class="form-body"> <textarea name="content"></textarea> <input type="submit" value="投稿"> </div> </div> <% end %>
orderメソッド
def index @posts = Post.all.order(created_at: :desc) end