测试视图时有关url参数的错误

时间:2015-12-23 10:51:12

标签: ruby-on-rails ruby ruby-on-rails-4 rspec-rails rspec3

运行提供的规范失败,我认为它可能与url参数有关,是地区/:id /.

  

收到错误:

1) territories/edit.html.erb shows a form with the data already in it
     Failure/Error: <%= form_for(territory, remote: true) do |territory_form| %>

     ActionView::Template::Error:
       No route matches {:action=>"show", :controller=>"territories", :format=>nil, :id=>nil, :locale=>#<Territory id: 2, name: "Territory 4", lent_on: "2015-12-21", returned_on: "2015-12-21", lent_to: 6, created_at: "2015-12-23 10:04:15", updated_at: "2015-12-23 10:04:15">} missing required keys: [:id]

我正在使用form_for。我发现在我的视图中收到关于url参数的错误有点奇怪,而我在视图代码中没有与它直接相关的任何内容。

为了清楚起见,我还提供了控制器代码。

有人可以指导我如何修复此问题或如何正确测试此

  

edit.html.erb

<h1>Territories#edit</h1>
<p>Find me in app/views/territories/edit.html.erb</p>

<%= render partial: "territory_form", locals: { territory: @territory } %>
  

edit.html.erb_spec.rb

require 'rails_helper'

RSpec.describe "territories/edit.html.erb", type: :view, territories:true do
  before(:each) do
    @territory = create(:territory)
    render
  end

  it "shows a form with the data already in it" do
    puts "Body: #{rendered}"
    expect(rendered).to have_css("label", :text => "Name")
    expect(rendered).to have_css "input[value*='#{@territory.name}']"
  end
end
  

的routes.rb

        Prefix Verb   URI Pattern                                     Controller#Action
  sessions_new GET    (/:locale)/sessions/new(.:format)               sessions#new {:locale=>/en|nl/}
   sign_up_new GET    (/:locale)/sign_up/new(.:format)                sign_up#new {:locale=>/en|nl/}
         users GET    (/:locale)/users(.:format)                      users#index {:locale=>/en|nl/}
     edit_user GET    (/:locale)/users/:id/edit(.:format)             users#edit {:locale=>/en|nl/}
          user GET    (/:locale)/users/:id(.:format)                  users#show {:locale=>/en|nl/}
               PATCH  (/:locale)/users/:id(.:format)                  users#update {:locale=>/en|nl/}
               PUT    (/:locale)/users/:id(.:format)                  users#update {:locale=>/en|nl/}
               DELETE (/:locale)/users/:id(.:format)                  users#destroy {:locale=>/en|nl/}
      register GET    (/:locale)/register(.:format)                   users#new {:locale=>/en|nl/}
               POST   (/:locale)/register(.:format)                   users#create {:locale=>/en|nl/}
         login GET    (/:locale)/login(.:format)                      sessions#new {:locale=>/en|nl/}
               POST   (/:locale)/login(.:format)                      sessions#create {:locale=>/en|nl/}
        logout DELETE (/:locale)/logout(.:format)                     sessions#destroy {:locale=>/en|nl/}
      overview GET    (/:locale)/user/overview(.:format)              dashboard#index {:locale=>/en|nl/}
   territories GET    (/:locale)/admin/territories(.:format)          territories#index {:locale=>/en|nl/}
               POST   (/:locale)/admin/territories(.:format)          territories#create {:locale=>/en|nl/}
 new_territory GET    (/:locale)/admin/territories/new(.:format)      territories#new {:locale=>/en|nl/}
edit_territory GET    (/:locale)/admin/territories/:id/edit(.:format) territories#edit {:locale=>/en|nl/}
     territory GET    (/:locale)/admin/territories/:id(.:format)      territories#show {:locale=>/en|nl/}
               PATCH  (/:locale)/admin/territories/:id(.:format)      territories#update {:locale=>/en|nl/}
               PUT    (/:locale)/admin/territories/:id(.:format)      territories#update {:locale=>/en|nl/}
               DELETE (/:locale)/admin/territories/:id(.:format)      territories#destroy {:locale=>/en|nl/}
               GET    /:locale(.:format)                              sessions#new
          root GET    /                                               sessions#new
  

territories_controller.rb

class TerritoriesController < ApplicationController

  def index
    @territories = Territory.all.order(:name) #Must be changed to use pagination
  end

  def new
    @territory = Territory.new
  end

  def import

  end

  def create
    @territory = Territory.new(create_params)
    if (!@territory.save)
      render action: :create and return
    end

    render action :new
  end

  def show
  end

  def edit
    @territory = Territory.find(edit_params)
  end

  def update
    territory_params = update_params
    @territory = Territory.find(territory_params[:id])

    if (!@territory || !@territory.persisted?)
      render index and return
    end

    @territory.update(territory_params[:territory])
  end

  def destroy
  end


  private
  def create_params
    params.require(:territory).permit(:name)
  end

  def edit_params
    params.require(:id)
  end

  def update_params
    id = params.require(:id)
    territory = params.require(:territory).permit(:name)
    {:id => id, :territory => territory}
  end
end
  

territory_form.html.erb

<%= form_for(territory, remote: true) do |territory_form| %>
  <p>
    <%= territory_form.label :name %>
    <%= territory_form.text_field :name %>
  </p>
  <%= territory_form.submit %>
<% end %>

将其改为gist

1 个答案:

答案 0 :(得分:0)

def edit
  @territory = Territory.find(edit_params)
end

应该只是

def edit
  @territory = Territory.find(params[:id])
end