Rails路由问题 - 尝试从表单发布但它正在使用“GET”

时间:2013-10-16 13:59:47

标签: ruby-on-rails ruby

我在提交简单表单时遇到问题,而且我不完全确定这笔交易是什么。我认为问题在于,我正在尝试将用户个人资料页面中的表单提交给另一个模型(ItemShare)。它不是通过邮件提交表单,而是尝试发出GET请求。当我改变了ItemSharesController以允许这个时,它将ItemShare #index放入我的模态形式,即使我已经指定了我希望它发布的十亿个地方。 POST!

在我的routes.rb中:

  match '/item_shares' => 'item_shares#create', :via => :post
  resources :item_shares, :except => :create

表格:

  #share-list-button-dialog.modal.hide.fade{:role => "dialog"}
    .modal-dialog
      %h3 Share List
    .modal-body
      =form_for(ItemShare.new, :method => :post, :url => {:action => "create"}) do |f|
        =f.hidden_field(:item_id, :value => item.token)
        =f.hidden_field(:owner_id, :value =>user.id)
        =f.label :shared_user_email, "Your collaborator's email:"
        =f.text_field :shared_user_email, :value => "collaborator@example.com"
        =f.submit "Share"

ItemSharesController:

class ItemSharesController < ApplicationController

  def new
    @item_share = ItemShare.new
  end

  def create
    @item_share = ItemShare.new(params[:item_share])
    respond_to do |format|
      if @item_share.save
        format.html {redirect_to user_path(current_user.id), :notice => "List shared successfully"}
      else
        flash.now[:alert] = "Could not share list."
      end
    end
  end
end

这就是堆栈跟踪显示的内容:

Started GET "/item_shares/" for 127.0.0.1 at 2013-10-15 21:40:44 -0400
ActionController::RoutingError (No route matches [GET] "/item_shares"):
  actionpack (3.2.11) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  ...

这里发生了什么?

更新 ...终于知道了什么。 表单本身不是问题,但我用来触发模态表单的按钮。我有:

%button{'data-toggle' => 'modal', 'href' => '../item_shares/', 'data-target' => '#share-list-button-dialog'}

将其更改为: =button_to "Share", item_shares_path, "data-toggle" => "modal", "data-target" => "#share-list-button-dialog"

现在一切正常。非常感谢Helios de Guerra的帮助和耐心。 :)

2 个答案:

答案 0 :(得分:0)

乍一看,我会说这与=form_for(ItemShare.new

有关

根据我的经验,Rails从form_for中的url构建路径,这意味着你的内容会被搞砸。您可能想尝试一下:

#users/new
  def new
    @item_share = ItemShare.new
  end

#form
 =form_for(@item_share

我对此并不完全确定,但这是我的预感

答案 1 :(得分:0)

根据您的描述,您应该只使用标准惯例。

路线:

resources :item_shares

形式:

<%= form_for(ItemShare.new) do |f| %>
  ...
<% end %>

如果不起作用,请检查呈现页面的来源。表单标记应包含以下内容:

<form accept-charset="UTF-8" action="/item_shares" id="new_item_share" method="post">