了解rails对象的生命周期问题

时间:2013-11-26 08:31:01

标签: ruby-on-rails forms object controller

我是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会触及新动作或创建动作。

如果它要点击创建动作,那么这是怎么回事,因为表单实际上来自新动作,所以我无法弄清楚它是如何击中创建动作的。

我知道这是一个非常简单的问题。但我不知道它是如何发生的,因为我是铁杆新手。

请帮助我让我了解对象流程。

提前感谢。

2 个答案:

答案 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实例传递给表单。