新手问题 form_for submit 问题

LincolnDz · 2012年11月27日 · 最后由 zhangyuan 回复于 2012年11月28日 · 4720 次阅读

新手刚看完 tutorials,试做一个 Tasks 功能的页面,在使用 f.submit 时,设计按钮应链接到 update 方法,但实际却是链接到 create 方法,求解决!代码如下: $items/index.html.erb

<h2>Incomplete</h2>
  <%= form_for(:item) do |f| %>
    <% @items.each do |item| %>
      <% if !item.finish %>
        <p>
          <%= f.submit 'Finish' %>
          <%= item.name %>
          <%= item.finish %>
          <%= link_to "(Remove)", item, method: :delete %>
        </p>
      <% end %>
    <% end %>
  <% end %>

$items_controller.rb

  def index
    @item = Item.new
    @items = Item.all    
  end
  def new
    @item = Item.new
  end
  def create
    @item = Item.new(params[:item])
    # @item.save
    if @item.save
      redirect_to root_path
    else
      render 'new'
    end
  end
  def destroy
    @item = Item.find(params[:id]).destroy
      respond_to do |format|
      format.html { redirect_to items_url }
      format.json { head :no_content }
    end
  end
  def update
  end
end

如果你能更详细描述你的问题,比如贴上你的代码,或许自己就能找到问题所在 :)

@zhangyuan 贴了代码了,谢谢回复

我也是新手,所以我试着回答一下你的问题吧。 按照我的理解,只有在 new.html.erb 或 edit.html.erb 里面的 form_for 才会自动关联 create 或 update,其他的 view 里面要在 form_for 指定,所以你的应该是写成

%= form_for(@item, url: user_path, method: :put) do |f| %>

你试一下行不行,有可能 url: user_path, 不写也可以。

@AlphaLiu 是在 index.html.erb 里,主页面,也没有 user,只有一个简单的 items,在主页面按 Update 按钮,实现 item.finlish 从 true 到 false,加了上面那行代码后似乎就没了链接了..

#4 楼 @LincolnDz 是我弄错了。我的意思是你要在 form_for 里面指定 action 和 method,你试着加 method: :put 作为你的 form_for 的参数看看行不行。

@AlphaLiu

<%= form_for(@item, method: :put) do |f| %>

页面显示 “Routing Error

No route matches [PUT] "/items" Try running rake routes for more information on available routes.”

@AlphaLiu 是否在 controller 里面

@item = Item.new

这句不该用 new 方法?如果是 new 就是一个全新的 item,不对 form_for 加参数的话就链接到 create 方法?

#7 楼 @LincolnDz 使用 form_for时,这有两个问题:

  1. action 里的地址是什么(也就是请求的路由的 URL)?
  2. 表单的 method 是什么(也就是请求的路由的方法)?

这两个都是都要通过 form_for 第一个参数的persisted?的返回值来生成。如果返回true,就会生成create 对应的路由,并用 POST 方法;否则就生成update对应的路由,并用 PUT 方法。

具体的可以看看 actionpack/lib/action_view/helpers/form_helper.rb 这个文件里的form_for方法。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号