0

Michael Hartlチュートリアルを実行していますが、サインアウトを機能させるのに問題があります。

メールでIDを取得する代わりに、ユーザー名で作業しています。

サインアップと歌唱はどちらも問題なく機能しますが、サインアウトするとエラーが発生します。

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User with username = signout

app/controllers/users_controller.rb:9:in `show'

showメソッドでusers_controllerを検索するのはなぜですか?なぜそれを呼んでいるのですか?セッションコントローラのdeleteメソッドを呼び出す必要がありますよね?

問題のある行9は次のとおりです。

  8  def show
  9     @user = User.find_by_username!(params[:username])
  10 end

ユーザー名で検索してにルーティングするのではなく、「signout」==ユーザー名と見なすパラメータがどこに(どこに、何に)渡されるのかわかりませんsession#destroy。どうすればこれを診断できますか?Railsコンソールに何を入力して、現在paramsに含まれているものを確認できますか?

アップデート:

すぐに試してみると、以下の解決策がうまくいくと思いましたが、問題はエラーメッセージごとに変わったばかりでした。私は提案されたようにルートを移動しましたが、まだ取得しています

Request Parameters: {"username"=>"signout"}今回は私の中にあります

`Users#show model: users/show.html.erb where line #1 raised: 

undefined method username' for nil:NilClass 

Extracted source (around line #1): 

1: <\h2><%= @user.username %><\/h2> 
2: 
3: <!-- 
4:`

そして、これが私のroutes.rbファイルの内容です:

   match 'signup', to: 'users#new'
   match 'signin', to: 'sessions#new'
   match 'signout', to: 'sessions#destroy', via: 'delete'

   resources :sessions, only: [:new, :create, :destroy]

   match "/:username"  => "users#show", via: "get"
   resources :users
4

2 に答える 2

3

次のようなルートがあると思います。

get "/users/signout" => "sessions#destroy"

この前に、おそらく次のような行があります。

get "/users/:username" => "users#show"

問題は、へのルーティングが/users/signoutに一致し、リクエストをのアクションに/users/:username送信し、に設定することです。あなたはそれから呼んでいますshowUsersControllerparams[:username]"signout"User.find_by_username!("signout")

ルートの前に一致するように、/users/signoutルートをラインの上に配置する必要があります。Railsは、リクエストURIに一致する可能性のある最初のルートで一致するルートを見つけようとするのをやめることに注意してください。より一般的なワイルドカードルートは、重複する可能性のあるより具体的なルートの後に表示される必要があります。/users/:username/users/:username


RE:あなたのアップデート

ルートにはHTTPDELETEsignoutリクエストが必要です。これは、パラメータを使用したPOSTリクエストを介してレールがシミュレートし_method=deleteます。

このルートに一致させるには、フォームまたはを使用しbutton_toてDELETEリクエストを発行する必要があります。

button_to "Signout", signout_path, :method => :delete

セッションの破棄は(私の意見では)あらゆるタイプのHTTPリクエストを受け入れる必要がある特殊なケースです。ユーザーは、アドレスバーに入力/logoutまたは入力して、GETリクエストを介してセッションを破棄できる必要があります。/signoutを削除してvia: :delete、以下を使用することを強くお勧めします。

match 'signout' => 'sessions#destroy'

逆に、あなたは自分signupsigninルートに寛容すぎています。これは、特にGETリクエストとPOSTリクエストを使用し、同じアクションではなくnew、アクションにルーティングする必要があります。create

get 'signup' => 'users#new'
post 'signin' => 'sessions#create'

Railsコンソールに何を入力して、現在paramsに含まれているものを確認できますか?

何もない。paramsリクエストがないため、Railsコンソールからハッシュを検査することはできません。を追加してログファイルを調べるlogger.info(params.inspect)か、エラーメッセージとして表示してブラウザで調べることができますraise params.inspect

于 2012-07-17T19:46:40.920 に答える
1

私もこの問題に遭遇しました、そして、meagarによって言及された修正は私のためにそれを解決しませんでした。DELETE私の問題は、実際にはJavaScriptとリンクで使用されているメソッドに起因していました。DELETEどうやらブラウザはJavaScriptの助けなしに実際にリクエストをサポートしていません。

再現するには、JavaScriptをオフにして、このリクエストを利用するリンクを試してみてください。GET指定されたの代わりにリクエストが使用されていることがわかりますDELETErails.js最終的には、これを解決するために(またはjquery-ujs私の場合は)必要なapplication.jsを含める必要がありました。

于 2013-01-28T20:12:16.567 に答える