viewでヘルパーを使用
index.html.erb
<% @posts.each do |post| %> <li> <%= link_to post.title, post_path(post) %> </li> <% end %>
posts_controller.rb
def show @post = Post.find(params[:id]) end
show.html.erb
<h2><%= @post.title %></h2> <p><%= @post.body %></p>
app/assets/images/logo.png
link_toでリンクを指定し、root_pathでリンク先を指定する
<div class="container"> <h1><%= link_to image_tag('logo.png', class: 'logo'), root_path %></h1> <%= yield %> </div>
css
.logo { width: 200px; height: 50px; }
リンクを作成する
<h2> <%= link_to 'Add New', new_post_path, class: 'header-menu' %> My Posts </h2>
css
.header-menu { font-size: 12px; font-weight: normal; float: right; }
controller
def new end def create end
new.html.erb
<h2>Add New Post</h2> <%= form_for :post, url:posts_path do |f| %> <p> <%= f.text_field:title, placeholder: 'enter title' %> </p> <p> <%= f.text_area:body, placeholder: 'enter body text' %> </p> <p> <%= f.submit %> </p> <% end %>
css
input[type="text"], textarea { box-sizing: border-box; width: 400px; padding: 5px; } textarea { height: 160px; }
posts_controller.rb
def create render plain: params[:post].inspect end
def create # render plain: params[:post].inspect @post = Post.new(params[:post]) @post.save redirect_to posts_path end
private methodで書く
def create # render plain: params[:post].inspect @post = Post.new(post_params) @post.save redirect_to posts_path end private def post_params params.require(:post).permit(:title, :body) end
バリデーション
app/models/post.rb
class Post < ApplicationRecord validates :title, presence: true, length: {minimum: 3, message: 'too short to post!'} validates :body, presence: true end
controller
def create # render plain: params[:post].inspect @post = Post.new(post_params) if @post.save redirect_to posts_path else render 'new' end end
view
<p> <%= f.text_field:title, placeholder: 'enter title' %> <% if @post.errors.messages[:title].any? %> <span class="error"><%= @post.errors.messages[:title][0] %></span> <% end %> </p> <p> <%= f.text_area:body, placeholder: 'enter body text' %> <% if @post.errors.messages[:body].any? %> <span class="error"><%= @post.errors.messages[:body][0] %></span> <% end %> </p>
### edit
index.html.erb
<%= link_to post.title, post_path(post) %> <%= link_to '[Edit]', edit_post_path(post), class: 'command' %>
controller
def edit @post = Post.find(params[:id]) end
edit.html.erb
L newとほぼ同じ
<h2>Edit Post</h2> <%= form_for @post, url:post_path(@post) do |f| %> <p> <%= f.text_field:title, placeholder: 'enter title' %> <% if @post.errors.messages[:title].any? %> <span class="error"><%= @post.errors.messages[:title][0] %></span> <% end %> </p> <p> <%= f.text_area:body, placeholder: 'enter body text' %> <% if @post.errors.messages[:body].any? %> <span class="error"><%= @post.errors.messages[:body][0] %></span> <% end %> </p> <p> <%= f.submit %> </p> <% end %>
controller
def update @post = Post.find(params[:id]) if @post.update(post_params) redirect_to posts_path else render 'edit' end end
改行を適切なタグに直す
<h2><%= @post.title %></h2> <p><%= simple_format @post.body %></p>
### partialで共通部品を作る
partialはアンダーバー(_)から始める
views/posts/_form.html.erb
<%= form_for @post do |f| %> <p> <%= f.text_field:title, placeholder: 'enter title' %> <% if @post.errors.messages[:title].any? %> <span class="error"><%= @post.errors.messages[:title][0] %></span> <% end %> </p> <p> <%= f.text_area:body, placeholder: 'enter body text' %> <% if @post.errors.messages[:body].any? %> <span class="error"><%= @post.errors.messages[:body][0] %></span> <% end %> </p> <p> <%= f.submit %> </p> <% end %>
edit.html.erb
L partialの名前をアンダーバー抜きで書く
<h2>Edit Post</h2> <%= render 'form' %>
new.html.erb
<h2>Add New Post</h2> <%= render 'form' %>
### delete
<li> <%= link_to post.title, post_path(post) %> <%= link_to '[Edit]', edit_post_path(post), class: 'command' %> <%= link_to '[x]', post_path(post), method: :delete, class: 'command', data: { confirm: 'Sure ?'} %> </li>
controller
def destroy @post = Post.find(params[:id]) @post.destroy redirect_to posts_path end