为什么form_for:symbol会返回同一页面?

时间:2014-10-24 02:12:34

标签: ruby-on-rails

我有一个表单,我的新模板和编辑模板都用于名为product的模型。在我的控制器中,对于创建和更新操作,它会重定向到@product,然后呈现" show"一旦成功。当使用`form_for @product do | f |声明表单时,这可以正常工作,但如果使用符号而不是实例变量,它会尝试POST到同一页面。 I.E.如果我在页面上产品/ 4 /编辑并且我在表单上按了提交,它会给我一个路由错误,它试图POST产品/ 4 /编辑,它只有资源中的GET路由。

现在,如果我输入url选项" url:products_path"它正确地重定向到products / 4,就像我使用form_for @product一样。这是否意味着使用带有form_for的符号不会进入我的控制器操作?为什么要尝试POST自己?

这是表格

<%= form_for @product do |f| %>     <-- Changing this to :product gives routing error
  <% if @product.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>

      <ul>
      <% @product.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_area :description, rows: 6 %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

这是我的控制器操作,用于更新和创建:

 def create
    @product = Product.new(product_params)

    respond_to do |format|
      if @product.save
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render :show, status: :created, location: @product }
      else
        format.html { render :new }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @product.update(product_params)
        format.html { redirect_to @product, notice: 'Product was successfully updated.' }
        format.json { render :show, status: :ok, location: @product }
      else
        format.html { render :edit }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

1 个答案:

答案 0 :(得分:1)

当你在表单中使用符号时,它基本上告诉form_builder你正在为什么样的对象创建表单。如果碰巧有一个实例变量设置为例如@product,那么表单甚至足够聪明,可以在渲染输入变量时获取值。但是,为了通过rails resourceful routing确定正确的url路径,您需要传递资源。

@product与以下产品不同:产品。实例变量反映了系统中的资源,因此可以为其生成资源丰富的路由。当使用符号时,情况并非如此,这就是为什么需要明确设置url参数。

使用:product时,表单操作的网址会设置当前网页的网址,这就是您的提交进入编辑操作的原因。