【问题标题】:understanding of rails object life cycle issue了解rails对象生命周期问题
【发布时间】:2013-11-26 08:31:01
【问题描述】:

我是 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]).

然后在表单中我有 &lt;%= form_for(@user) do |f| %&gt; 。 我的问题是@user 对象实际上意味着什么? 我的意思是,@user 会执行新操作还是创建操作。

如果它要触发创建动作,那么这是如何发生的,因为表单实际上来自新动作,所以我无法弄清楚它是如何触发创建动作的。

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

请帮我让我理解对象流。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails forms object controller


    【解决方案1】:

    “新建”操作创建一个新对象并显示一个用于编辑它的表单。该表单提交到“创建”操作,因为该对象尚未保存。

    如果你这样做了

    form_for @user
    

    并且@user 是之前保存的对象,表单将提交给更新操作。

    form_for 有点神奇,就像很多 rails 一样:它做了两件事:

    • 将表单的“action”属性设置为指向“/users”(用于创建)和“/users/:id”(用于更新)

    • 在更新的情况下(即对于已经有 id 的对象),它还添加了一个隐藏字段来触发更新操作:这个隐藏字段将如下所示:&lt;input type="hidden" value="put" name="_method"&gt;

    查看您的 rails api 中的 form_for。

    【讨论】:

      【解决方案2】:

      由于表单 URL 正确,它会触发 create 操作。当您运行rake routes 命令时,您会看到POST /users 导致users#create 操作——这就是new 表单中的URL。 Rails 正确设置了 URL(并生成了表单字段),因为您将 User 实例传递给表单。

      【讨论】:

      • 感谢@Marek Lipka 的回复。但是该表单是从新操作中呈现的,然后它是如何触发创建操作的。那么为什么我们需要在新操作中定义用户实例,因为它似乎未使用。如果我错了,请让我清楚。
      • @user1463066,正如我所写,Usernew 操作中创建的实例用于使用form_for 方法生成正确的表单。它设置正确的表单 URL 并使创建表单字段变得方便。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多