BNBのプログラミング勉強記録

ガチのプログラミング初心者が駆け上がっていくブログ

メモ(Rails III)

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>

便利っすね。意義が分かってきたぞ。

<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