ActionController :: RoutingError:没有路由匹配[POST]" / locations / new"

时间:2014-01-10 20:18:40

标签: ruby-on-rails

路线

resources :locations, :only => [:new, :create]

控制器

 class LocationsController < ApplicationController
  def new
    @location = Location.new
  end

  def create
    @location = Location.new(location_params)

    if @location.save
      flash[:notice] = 'Created location successfully'
      redirect_to new_location_path
    else
      flash[:notice] = 'Invalid information. Please try again'
      render :new
    end
  end

  private

  def location_params
    params.require(:location).permit(:name, :street, :city, :state)
  end
end

单击“保存”时出现错误消息。

 ActionController::RoutingError:
       No route matches [POST] "/locations/new"

视图

<%= simple_form_for :locations do |form| %>
  <%= form.input :name %>
  <%= form.input :street %>
  <%= form.input :city %>
  <%= form.input :state %>

  <%= form.submit 'Create location' %>
<% end %>

使用capybara测试当我点击保存它时会创建一个新位置。我不太确定为什么它不知道后期路线是什么,因为我有新的和创建路线。如果我将一个binding.pry放在create方法下面,它就不会被调用。所以我的创建方法由于某种原因没有被调用。

编辑:

Rake Routes

locations    POST   /locations(.:format)                        locations#
new_location GET    /locations/new(.:format)                    locations#new

3 个答案:

答案 0 :(得分:1)

资源通常GET为new,POST为create。因此,您的表单可能会提交回新操作,而不是提交到创建操作。

以下是此指南:http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

答案 1 :(得分:1)

问题在于观点。

<%= simple_form_for :locations do |form| %>
  <%= form.input :name %>
  <%= form.input :street %>
  <%= form.input :city %>
  <%= form.input :state %>

  <%= form.submit 'Create location' %>
<% end %>

当我应该从控制器调用实例变量@location时,我正在调用位置符号。

实际问题是rails 3.2.12不接受私人参数

答案 2 :(得分:0)

使用resources,应使用new而不是GET获取POST操作。 create将为POST。检查您的rake routes