我刚看了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?
毕竟我不会在任何地方使用此参数。
答案 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调用它。