[ruby-on-rails] “/ users / sign_out”고안 레일 3과 일치하는 경로가 없습니다.

내 앱에 devise를 설치하고 application.html.erb파일에 다음을 적용했습니다 .

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

나는 rake routes모든 경로가 유효한지 확인하고 실행 했습니다.

또한 내 routes.rb파일에는 devise_for :users및이 root :to => "home#index"있습니다.

“로그 아웃”링크를 클릭하면 다음과 같은 라우팅 오류가 발생합니다.

No route matches "/users/sign_out"

어떤 오류가 발생했는지 아이디어가 있습니까?



답변

로그 아웃 경로는 DELETE방법 이라고 생각합니다 . 즉, 로그 아웃 링크는 다음과 같아야합니다.

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

귀하의 :method => :delete부분 은 포함되어 있지 않습니다 . 또한이 기능이 작동하려면 <%= javascript_include_tag :defaults %>레이아웃 파일 ( application.html.erb) 에도 포함시켜야합니다 .


답변

devise.rb 에서이 줄을 변경했습니다.

config.sign_out_via = :delete

config.sign_out_via = :get

그리고 그것은 나를 위해 일하기 시작했습니다.


답변

jquery_ujs 자바 스크립트 파일을 포함하지 않았을 수 있습니다. 최신 버전의 jquery-ujs ( https://github.com/rails/jquery-ujs) 와 사용 가능한 마지막 파일을 사용하고 있는지 확인하십시오 .

rails generate jquery:install

당신은해야 하지 더 이상 rails.js 파일이 있습니다. 그렇게한다면 아마도 구식 일 것입니다. 이 파일이 config / application.rb에 기본값으로로드되어 있는지 확인하십시오

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(다시 말하지만, 당신은해야 하지 여기 rails.js 파일이 있습니다). 마지막으로 Devise wiki (haml-style) 에 설명 된대로 링크를 추가하십시오 .

= link_to('Logout', destroy_user_session_path, :method => 'delete')

그리고 모든 것이 잘 될 것입니다.


답변

로그 아웃 링크를 DELETE RESTful 호출로 만들 data-method = "delete"려면 rails 코드를 사용하여 html 속성 이 필요합니다= link_to('Logout', destroy_user_session_path, :method => :delete) .

그러나 gem이 jquery-ujs설치되어 있지 않거나 application.html에서 결과 javascript를 호출하지 않으면= javascript_include_tag "application" 응답이 GET 요청으로 전송되고 경로가 실패합니다.

사용하지 않거나 jquery-ujs작동 방법을 찾을 수없는 경우 몇 가지 옵션이 있습니다 .

  1. config.sign_out_via에서 동일하게 변경:getdevise.rb (DELETE가 적절한 RESTful 쿼리이므로 권장하지 않음)
  2. 또는 변경 link_to= button_to('Logout', destroy_user_session_path, :method => :delete). With button_toRails는 적절한 DELETE 호출을 위해 많은 노력을 기울일 것입니다. 그런 다음 원하는 경우 링크처럼 보이도록 단추의 스타일을 지정할 수 있습니다.

답변

devis / sessions # destroy에 새 경로를 추가하고 연결해보십시오. 예 :

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

전망:

<%= link_to "Logout", logout_path %>


답변

route.rb 파일에서 사용하십시오 :

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end


답변

rails 3.1.0과 같은 문제가 있었고 파일에 다음 줄을 추가하는 것을 해결했습니다.

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs