我是rails的新手。我对rails对象生命周期有一些困惑。在rails中我们有下面的代码。
class UsersController < ApplicationController
# GET /users
# GET /users.json
def index
@users = User.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @users }
end
end
# GET /users/1
# GET /users/1.json
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
end
# GET /users/new
# GET /users/new.json
def new
@user = User.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @user }
end
end
# GET /users/1/edit
def edit
@user = User.find(params[:id])
end
# POST /users
# POST /users.json
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render json: @user, status: :created, location: @user }
else
format.html { render action: "new" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# PUT /users/1
# PUT /users/1.json
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# DELETE /users/1
# DELETE /users/1.json
def destroy
@user = User.find(params[:id])
@user.destroy
respond_to do |format|
format.html { redirect_to users_url }
format.json { head :no_content }
end
end
end
然后以我们的形式
<%= form_for(@user) do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我的困惑在于控制器中的新动作@user = User.new
并再次在创建@user = User.new(params[:user]).
然后在形式上我有<%= form_for(@user) do |f| %>
。
我的问题是@user
对象实际上意味着什么?
我的意思是这个@user
会触及新动作或创建动作。
如果它要点击创建动作,那么这是怎么回事,因为表单实际上来自新动作,所以我无法弄清楚它是如何击中创建动作的。
我知道这是一个非常简单的问题。但我不知道它是如何发生的,因为我是铁杆新手。
请帮助我让我了解对象流程。
提前感谢。
答案 0 :(得分:1)
“新”操作会生成一个新对象,并显示一个用于编辑它的表单。该表单提交“创建”操作,因为该对象尚未保存。
如果你做了
form_for @user
和@user是以前保存的对象,表单将提交给更新操作。
form_for有点神奇,就像许多铁轨一样:它做了两件事:
将表单的“action”属性设置为指向“/ users”(对于create)和“/ users /:id”(对于update)
在更新的情况下(即对于已经拥有id的对象),它还会添加一个触发更新操作的隐藏字段:此隐藏字段将如下所示:<input type="hidden" value="put" name="_method">
。
在rails api中查看form_for。
答案 1 :(得分:0)
由于正确的表单网址,它正在点击create
操作。当您运行rake routes
命令时,您会看到POST /users
导致users#create
操作 - 这是new
表单中的网址。 Rails正确设置了URL(并生成了表单字段),因为您将User
实例传递给表单。