本を読みながらコード書いたり、動かしたりしていても細かい動きが解らなくて、わかったようなわからないようなそんな感じだったのですが、細かく見ていくと何となく見えてきたような。。。
理解が足りないところなど、ご指摘いただければ助かります。
def index
@users = User.all
end
<h1>Users</h1>
<ul>
<% @users.each do |u| %>
<li>
<%= link_to u.name, user_path(u.id) %>
</li>
<% end %>
</ul>
コントローラのindex
内で作られた@users
をビューのindex.html.erbに渡す流れなのですが、こう単純に見ると繋がりが見えやすいと思います。
コントローラのindex
内で明示的にrender
を書かないと対応するテンプレートが自動で呼び出されるそうです(index.html.erb)。
<h1>Users</h1>
<ul>
<% @users.each do |u| %>
<li>
<%= link_to u.name, user_path(u.id) %>
<%= link_to "[Edit]", edit_user_path(user.id) %>
</li>
<% end %>
</ul>
def edit
@user = user.find(params[:id])
end
link_to "[Edit]", edit_user_path(user.id)
からedit_user_path(user.id)
にページ移動する時のedit
内のparams[:id]
。ここのparams
はリンクによるパラメータの受け渡しでparams[:id]
とedit_user_path(user.id)
の受け渡しをしているみたいです。
class User < ActiveRecord::Base
validates :name, presence: { message: "未入力" },
length: { minimum: 3, message: "3文字以上" }
end
<h1>Edit</h1>
<%= form_for @user do |f| %>
<p>
<%= f.label :name %><br>
<%= f.text_field :name %>
<% if @user.errors.any? %>
<%= @user.errors.messages[:name][0] %>
<% end %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
def update
if @user.update(user_params)
redirect_to user_path
else
render 'edit'
end
end
def edit
@user = user.find(params[:id])
end
def user_params
params[:user].permit(:name)
end
edit
が@user = user.find(params[:id])
でuser情報を保持してedit.html.erbを表示。form_for
でフォームを生成、if @user.errors.any?
でエラーのチェックをしてますが、Userモデルでのvalidatesの設定を見ているようです。@user.errors.messages[:name][0]
で各エラーのmessage:
を拾えるみたいです。f.submit
はリファレンスによると、引数を指定しないと、対象のモデルが保存済みかを調べて、「Create モデル名」「Update モデル名」のどちらかを表示するようです。