Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails _Ruby On Rails_Ruby On Rails 3_Devise_Routes - Fatal编程技术网

Ruby on rails

Ruby on rails ,ruby-on-rails,ruby-on-rails-3,devise,routes,Ruby On Rails,Ruby On Rails 3,Devise,Routes,我收到了贬值的警告,因此我将其替换为: devise_scope :users do get '/users/sign_out' => 'devise/sessions#destroy' end 我想我会删除jQuery。糟糕的选择。Deviate正在使用jQuery“伪造”删除请求并将其作为GET发送。因此,您需要: //= require jquery //= require jquery_ujs 当然,与前面提到的许多链接相同: <%= link_to "Sign

我收到了贬值的警告,因此我将其替换为:

devise_scope :users do
   get '/users/sign_out' => 'devise/sessions#destroy'
end
  • 我想我会删除jQuery。糟糕的选择。Deviate正在使用jQuery“伪造”删除请求并将其作为GET发送。因此,您需要:

    //= require jquery
    //= require jquery_ujs
    
  • 当然,与前面提到的许多链接相同:

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

  • 页面中的
    ':method=>:delete
    '是'
    data method=“delete”
    ' 因此,您的页面必须有jquery_ujs.js,当您获得“无路由匹配”时,它通常会使用方法delete而不是方法get提交链接,但您认为您已经定义了该路由,然后再次检查该路由的http谓词/请求方法(是否为get、put、post、delete等)


    如果您运行rake路由,那么您将看到预期的方法,您可以将其与请求日志进行比较

    有很多解决方案。但主要是用这个,

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

    大多数答案都是片面的。我已经多次提到这个问题。需要解决两件事:

    <%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
    
    如果您正在使用,则如果您的注销链接指向非安全版本,该链接将中断。在后端,它重定向到安全版本。该重定向是一个GET,它导致了问题

    确保您的链接使用HTTPS。您可以在url帮助器中使用
    协议:“https”
    强制它(确保使用url帮助器而不是路径帮助器)


    使用路径的
    :get
    :delete
    方法:

    devise_scope :user do
      match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
    end
    

    我知道这是一个基于Rails3的老问题,但我只是在Rails4.0.4上遇到并解决了它。所以我想我会为任何遇到这个版本问题的人介绍我是如何解决这个问题的。你的里程数可能会有所不同,但以下是对我有效的方法

    首先确保安装了gems并运行bundle安装

    gem 'jquery-rails'
    
    gem 'turbolinks'
    
    gem 'jquery-turbolinks'
    
    在application.js中,检查是否需要如下所示的所有内容

    如果遇到此问题,请小心:它是
    /=require jquery.turbolinks
    而不是
    /=require jquery turbolinks

    //= require jquery
    //= require jquery_ujs
    //= require jquery.turbolinks
    //= require turbolinks
    //= require_tree .
    
    接下来,在application.html.erb的标题中添加适当的链接

    <%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
    <%= javascript_include_tag :defaults %>
    


    希望这有助于把某人从这个令人沮丧的洞里挖出来

    添加路由后是否重新启动应用程序?路线更改仅在启动时生效。是。只是为了安全再做一次。另外,我在堆栈上的其他地方读到,最新的Desive gem可能与Rails 3.0.3不兼容,因此我尝试将我的Desive gem从1.4.2更改为
    gem'Desive',:git=>git://github.com/plataformatec/devise.git“
    。但这并没有起到任何作用。更改GEM文件中的条目不会让您得到一个更新版本的Desive吗?你试过指定一个更低的版本号吗?你能发布你的routes.rb文件吗下面Jessie的第二个答案非常有效。我可以放心地说,我从来没有在任何Rails应用程序中这样做过<代码>链接到“注销”,销毁用户会话路径对我来说已经足够好了。我做了测试,它对我很有效。不要忘记,事情会从一个版本变为另一个版本(无论是Rails还是Desive)。此外,注销是一种状态改变行为,不应该使用GET方法(以我的拙见)来完成。有关更多信息,请参阅Desive最新版本中更改此行为的基本原理。我遇到了同样的问题,Jessie的建议对我起到了作用。我希望通过Desive railscast运行的任何人最终都会因为此更改而出现在这里……您也可以在web控制台中键入此内容以测试它-如果页面上加载了jQuery,则返回与mmichael相同的错误。上面的测试对我有效。我也有和mmichael一样的错误。上面的解决方案会起作用,但它不是应该如何解决的。Desive中的默认路由已经包括作为删除方法的注销路由。您通常不需要更改默认路由本身。这就是为什么您只需向
    link_to
    调用添加一个单独的参数即可解决此问题,如另一个答案中所述。您不必向route.rb文件添加路由。designe允许您更改designe.rb中的方法,该方法位于/confit/initializers/目录中。从未将注销路径设为GET。@Jagira为什么?为什么不同时使用DELETE和GET呢?以前的做法是使用“GET/users/sign_out”注销,但他们将其更改为“DELETE”以使其更加RESTful。作者解释说GET不应该对服务器进行诸如注销之类的更改。这对我来说很有效。虽然我知道这不是一个最佳实践,但其他答案都失败了。我不明白为什么!!如果希望支持多种方法,也可以使用数组。例如:
    config.sign\u out\u via=[:post,:delete]
    design\u For:users,:sign\u via=>[:post,:delete]
    ,如中所述。我不会使用GET请求注销,因为这会让用户面临XSRF攻击。(黑客创建了一个带有src=”图像标签的网站,用户访问该网站并注销)。@RyanDoherty Id我没有弄错,XSRF仍然是可能的(攻击者只需使用目标url上带有action=“DELETE”的表单,然后在页面加载时自动提交即可)。我的链接中有:method=>“DELETE”,问题是没有包含jquery\ujs,这个解决方案解决了我的问题。记得把gem'jqueryrails'放在你的gem文件中。谢谢,这对我很有用。除了使用默认值,您还可以使用
    javascript\u include\u标记“jquery\u ujs”
    很好,谢谢!我使用require.js异步加载文件,但忘记了需要jquery_ujs。我假设“u”表示未压缩,并从
    application.js
    中删除了这一行。我想这是个错误的假设。谢谢。这个问题(在我的第100个基于Desive的应用程序中)是在将twitter引导从less改为sass后出现的,我忘了将//=require jquery_ujs添加回我的应用程序中。js。谢谢!这让我快发疯了!感谢您发布此代码片段,请注销
    :delete
    
    'delete'
    
    <%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
    
    config.sign_out_via = :delete
    
    config.sign_out_via = :get
    
    <%= link_to('Sign out', destroy_user_session_path) %>
    
    app/assets/javascripts/application.js
    //= require_tree
    //= require jquery
    //= require jquery_ujs
    
      <%= csrf_meta_tag %>  and 
      <%= javascript_include_tag :defaults %>  to layouts
    
     link_to 'Sign out', destroy_user_session_path, :method => :delete
    
      or
    
     link_to 'Sign out', '/users/sign_out', :method => :delete
    
      devise_for :users do
        get '/users/sign_out' => 'devise/sessions#destroy'
      end
    
    config.sign_out_via = :get
    
    devise_for :users do
        get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
     devise_for :users do
        get '/sign_out' => 'devise/sessions#destroy'
        get '/log_in' => 'devise/sessions#new'
        get '/log_out' => 'devise/sessions#destroy'
        get '/sign_up' => 'devise/registrations#new'
        get '/edit_profile' => 'devise/registrations#edit'
     end
    
    <%if user_signed_in?%>
              <li><%= link_to "Sign_out", sign_out_path %></li>
    <% end %>
    
    //= require_self
    //= require jquery
    //= require jquery_ujs
    
    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    //= require jquery
    //= require jquery_ujs
    
    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
    <%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
    
    config.sign_out_via = :delete ( or  :get which u like to use.) 
    
    <%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
    
       <%= javascript_include_tag "myDirectiveJSfile" %> 
    
    //= require jquery
    //= require jquery_ujs
    
    <%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
    
    devise_scope :user do
      match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
    end
    
      devise_for :users
      devise_scope :user do
        get '/users/sign_out' => 'devise/sessions#destroy'
      end
    
    gem 'jquery-rails'
    
    gem 'turbolinks'
    
    gem 'jquery-turbolinks'
    
    //= require jquery
    //= require jquery_ujs
    //= require jquery.turbolinks
    //= require turbolinks
    //= require_tree .
    
    <%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
    <%= javascript_include_tag :defaults %>
    
    <p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>