【问题标题】:Rails - link_to method is accidentally(?) being triggered on page refreshRails - 页面刷新时意外触发了link_to方法(?)
【发布时间】:2014-10-13 17:53:16
【问题描述】:

我对 Rails 很陌生,请注意!我暂时需要使用这些版本:
导轨:3.2.18
红宝石:1.9.3-p194

每当我从link_to 按钮调用自定义方法destroy_session 时,它似乎工作正常。但是,每当我手动刷新页面时,session[:session_token] 就会被清除,就好像调用了 destroy_session 方法一样......我不知道为什么?


如果我从视图中完全删除 <link_to> 按钮,那么无论我刷新浏览器多少次,session[:session_token] 都会保持原样。这是我当前的工作流程,可以进一步阐述:

  • 单击“获取令牌”按钮发出 AJAX 请求并将响应存储在 session[:session_token]
  • 按预期刷新视图并将会话令牌写入屏幕。
  • 如果我在浏览器中手动点击刷新,会话令牌就会消失,就像我调用了 destroy_session 方法一样。


查看 /app/views/searches/index.html.erb

<%= link_to 'Delete Token', action: destroy_session_path %>


控制器 /app/controllers/searches_controller.rb

helper_method :destroy_session

def destroy_session
  session[:session_token] = nil
end


路线 /config/routes.rb

resources :searches
match '/searches/destroy_session' => 'searches#destroy_session', :as => :destroy_session
post '/searches/get_token' => 'searches#get_token'
root :to => 'searches#index'


$ rake 路线

          searches GET    /searches(.:format)                 searches#index
                   POST   /searches(.:format)                 searches#create
        new_search GET    /searches/new(.:format)             searches#new
       edit_search GET    /searches/:id/edit(.:format)        searches#edit
            search GET    /searches/:id(.:format)             searches#show
                   PUT    /searches/:id(.:format)             searches#update
                   DELETE /searches/:id(.:format)             searches#destroy
   destroy_session        /searches/destroy_session(.:format) searches#destroy_session
          ajax_sum POST   /ajax/sum(.:format)                 my#ajax_sum
searches_get_token POST   /searches/get_token(.:format)       searches#get_token
              root        /                                   searches#index


不会引发任何错误或异常。有人可以帮我确定我在这里做错了什么吗?非常感谢!

【问题讨论】:

    标签: ruby-on-rails ruby session routes link-to


    【解决方案1】:

    您使用哪些导轨? 尝试在 routes.rb 中设置:

    get '/searches/destroy_session' => 'searches#destroy_session'
    

    然后

    <%= link_to 'Delete Token', searches_destroy_session_path %>
    

    也许会有所帮助

    【讨论】:

    • 除非您明确定义路由辅助方法名称,否则这是行不通的:get '/searches/destroy_session' =&gt; 'searches#destroy_session', :as =&gt; :searches_destroy_session
    • 感谢马尔科的帮助!我正在使用 Rails:3.2.18 和 Ruby:1.9.3-p194 我尝试了这种方法(有和没有 Surya 的建议)并收到此错误:ActiveRecord::RecordNotFound in SearchesController#show 找不到带有 id= 的搜索销毁会话
    • 你不知何故被重定向以显示动作。尝试在您的方法def destroy_session 中的session[:session_token] = nil 之后添加重定向到root。另外,请尝试删除此helper_method :destroy_session
    • Marko,我尝试过重定向,但没有成功。 destroy_session def 似乎根本没有被调用,因此没有内联执行重定向。 :/我已经更新了我上面的代码以反映一些变化......我觉得我们已经接近了! (我也删除了 helper_method,我看不出有什么明显的效果)
    【解决方案2】:

    请参阅link_to 文档。

    Method 应该是 HTTP 动词,而不是方法名称。调用控制器方法来销毁你的会话。

    例子:

    link_to "Some Text", :controller => :searches, :action => :destroy_session
    

    【讨论】:

    • 您可能应该将实际的方法和控制器名称放在示例中,因为 OP 已发布以更清晰。
    • 感谢尼基塔的帮助!我似乎一直遇到同样的错误: SearchesController#show 中的 ActiveRecord::RecordNotFound 找不到带有 id=destroy_session 的搜索
    • @ndcomix:将行:match '/searches/destroy_session' =&gt; 'searches#destroy_session' 置于您的 routes.rb 中的 resources :searches 下方,然后重试。
    • Surya,那行已经在我的路由文件中了。我将它直接移动到资源下:搜索(它下面有几行)但不幸的是没有任何改变
    【解决方案3】:
    <%= link_to 'Delete Token', method: destroy_session %>
    

    当 ruby​​ 读取这一行时,它会读取:

    <%= link_to 'Delete Token', method: nil %>
    

    因为你在这里执行destroy_session 方法,这自然会破坏会话。你的意思可能是:

    <%= link_to 'Delete Token', action: :destroy_session %>
    

    注意它是一个符号,而不是一个方法调用。另请注意,destroy_session 必须是一个操作,而不是辅助方法。

    最好还是给路由命名(需要重启服务器):

    match '/searches/destroy_session' => 'searches#destroy_session', as: :destroy_session
    

    并使用 url helper:

    <%= link_to 'Delete Token', action: destroy_session_path %>
    

    【讨论】:

    • 您确定单独使用action: :destroy_session 可以吗?我认为它只有在您使用 /searches/.. 时才会起作用,即使用其中一种搜索控制器方法。不过我可能不正确,从未尝试过。
    • 如果我没记错,如果控制器丢失,它将使用当前控制器。
    • 您好 BroiSatse,感谢您的帮助!我已经尝试过您的方法,但是每当我单击按钮时:destroy_action 未被调用,并且我被重定向到“显示”视图,但出现以下异常:ActiveRecord::RecordNotFound in SearchesController#show 找不到带有 id= 的搜索销毁会话
    • @BroiSatse:这就是我在第一条评论中的意思,感谢您的澄清。
    • @BroiSatse 我已经更新了上面的帖子以反映代码更改。我也重新启动了服务器,jic。目前,每当我尝试查看站点时,都会遇到路由错误:没有路由匹配 {:action=>"/searches/destroy_session", :controller=>"searches"} 我运行了 $rake 路由,它看起来像 destroy_session有没有……我很困惑
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多