Rails - 在页面刷新时意外(?)触发link_to方法

时间:2014-10-13 17:53:17

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

我对Rails很新,抬头!我暂时要求使用这些版本:
导轨:3.2.18
Ruby:1.9.3-p194

每当我从destroy_session按钮调用自定义方法link_to时,它似乎工作正常。但是,无论何时我手动刷新页面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 routes

          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


不会抛出任何错误或异常。有人请帮助我确定我在这里做错了什么吗?非常感谢你!

3 个答案:

答案 0 :(得分:0)

请参阅link_to文档。

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

示例:

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

答案 1 :(得分:0)

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

当红宝石正在读这行时,它将显示为:

<%= 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 %>

答案 2 :(得分:0)

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

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

然后

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

也许会有所帮助