1

我试图让控制器的“破坏”正常工作,我想知道正确的设置应该是什么。

我得到的错误是

ActiveRecord::RecordNotFound in AuthenticationsController#destroy
Couldn't find Authentication without an ID

我的控制器看起来像

class AuthenticationsController < InheritedResources::Base
def destroy
    @authentication = current_user.authentications.find(params[:id])
    @authentication.destroy
    redirect_to(:back)
end

数据库表

 create_table "authentications", :force => true do |t|
    t.integer  "user_id"
    t.string   "provider"
    t.string   "uid"
    t.string   "secret"
    t.string   "token"
  end

我尝试过其他参数,例如 :user_id 如何让用户销毁他们的令牌?(可以选择稍后重新进行身份验证)

4

2 回答 2

2

您没有将 id 传递给控制器

尝试

<%= link_to "Disconnect Your Authentication", {:controller=>'authentications', :action=>'destroy', :id=>current_user.authentication_id} %> 

或使用带有@autentication 参数的路径助手作为选项。

(您将需要编辑您的路线文件)

于 2013-04-12T23:52:13.773 回答
0

如果您想销毁用户的所有身份验证,您当然可以将控制器的销毁方法更改为:

def destroy
  current_user.authentications.destroy_all
end

更传统的方法是破坏特定的身份验证。在这种情况下,该link_to方法需要一个包含 id 参数的路径(最终将作为您params[:id]在控制器中的值)。您可以想象一个如下所示的视图片段,它显示所有用户的身份验证,每个身份验证都有一个销毁链接:

<ul>
<% current_user.authentications.each do |a| %>
  <li>
    <%= a.provider %>
    - 
    <%= link_to 'Disconnect Your Authentication', authentication_path(a), :method => :delete %>
  </li>
<% end %>
</ul>

这假设 current_user 是一个助手,并且您的路由是在您的身份验证模型上设置的。authentication_path助手使用身份a验证实例生成路径,并带有 id 参数。

于 2013-04-13T00:04:01.730 回答