0

私はRailsの初心者であり、ルーティングのバグのように見えます。

Webサイトとそのクロール方法に関する情報を保持するSiteオブジェクトがあります。コードとサイトへの接続をテストしたいと思います。アプリで「テストサイト」をクリックすると、エラーが発生します。

Couldn't find Site without an ID

app/controllers/sites_controller.rb:86:in `test_site'

ルート.rb

...
      post "/test_site" => "sites#test_site" 
      get "home/index"
      resources :sites, :logins
...

index.html.erb

...    
      <% @sites.each do |site| %>
      <tr>
        <td>
            <%= form_tag test_site_path(site) do -%>
            <div><%= submit_tag 'Test site' %></div>
            <% end -%>
...

sites_controller.rb

...
      def test_site
        @site = Site.find(params[:id])
...

Sitesコントローラーがtest_site_path(site)からSite:idを取得していないようです。ルートを設定してIDを正しく渡す方法がわかりません。

ありがとう!

編集:このコードをroutes.rbに追加してみました:

resources :sites do 
  get "/test_site", :action => "test_site", :on => :member 
end 

このエラーが発生します:

No route matches {:controller=>"sites", :action=>"test_site", :format=>#<Site id: 11, ... 

私は何を間違っているのでしょうか?

4

1 に答える 1

0

初心者には、このような問題をデバッグするのに役立つので、新しい機能を追加するときにコントローラーのテストを作成するプロセスに入ることが最善の方法です。独自のアクションを作成する代わりに、安らかなアクションを使用してください。代わりに、index、new、edit、create、update、show、destroy を使用してみてください。

sites_controller_spec.rb

require 'spec_helper'

describe SitesController do
  let(:site) { Site.create() } #Add to create what a site requires, eventually this will become a fixture but don't worry about that now
  describe "#show" do
   before { get :show, id: site.to_param }
   it "responds with success" do
     response.should be_success
   end
  end
end

このテストを実行します。ルートがないことを教えてくれます

ルート.rb

リソース :サイト、のみ: %w[表示]

このテストを実行します。これは失敗し、サイト コントローラーと show アクションを作成するように指示されます。

class SitesController < ApplicationController
  def show
  end
end

テストを再度実行します。ビューがないため、今は文句を言います。

表示 -> ディレクトリ (サイト) を作成 -> 内部にファイル show.html.erb を作成

テストを再度実行します。今は過ぎ去っています。REST を使用してルーティングが正しく機能するようになり、機能していることの確認が自動化されました。

これは今は少し真似ているように思えるかもしれませんが、これを習慣にすれば、それが第二の性質になり、ルーティングのバグに再び対処する必要がなくなることを保証します.

于 2013-03-24T02:57:51.890 に答える