辅助方法中的参数

时间:2014-10-06 07:20:47

标签: ruby-on-rails ruby-on-rails-4

我刚看了Railscasts专业第250集,我不明白一件事。我谈到这一行:

<%= link_to "Log out", session_path("whatever"), method: 'delete' %>

作者说出类似的话:

  

会话路径帮助器方法可以期望id通过这里传递

我的控制器操作:

  def destroy
    session[:user_id] = nil
    redirect_to root_path, notice: "Looged out"
  end

在我的route.rb文件中:

  resources :sessions

为什么我不能传递<%= link_to "Log out", session_path(), method: 'delete' %>?当我这样做时,我收到一个错误:

  

没有路线匹配{:action =&gt;&#34; show&#34;,:controller =&gt;&#34;会话&#34;}丢失   必填项:[:id]

为什么这里需要id?

毕竟我不会在任何地方使用此参数。

2 个答案:

答案 0 :(得分:3)

当我们为控制器定义路由时,我们将以下行添加到路由文件

resources :sessions

以上这一行隐含地创建了7条默认路由

                                     sessions GET      /sessions(.:format)                                                                 sessions#index
                                              POST     /sessions(.:format)                                                                 sessions#create
                                  new_session GET      /sessions/new(.:format)                                                             sessions#new
                                 edit_session GET      /sessions/:id/edit(.:format)                                                        sessions#edit
                                      session GET      /sessions/:id(.:format)                                                             sessions#show
                                              PUT      /sessions/:id(.:format)                                                             sessions#update
                                              DELETE   /sessions/:id(.:format)                                                             sessions#destroy

此处,对于destroy操作,路线为/sessions/:id(.:format),方法为DELETE。由于网址在网址中需要:id,因此您需要发送一些ID。 id表示它不应该只是整数,它可以是类似字符串的东西。因此,他们使用“无论如何”。删除会话时在该URL中。

答案 1 :(得分:1)

该路由是强制执行缺少的ID。我看不到你的其余代码,但你可能有一个看起来像这样的路径:

session GET    /sessions/:id(.:format)           sessions#show

此路线要求您使用ID调用它。