Controller中的ActiveRecord :: RecordNotFound#destroy

时间:2013-04-12 22:57:03

标签: ruby-on-rails ruby omniauth

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

我得到的错误是

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 如何让用户销毁他们的令牌? (可选择稍后重新验证)

2 个答案:

答案 0 :(得分:2)

您没有将ID传递给控制器​​

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

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

(您需要编辑路线文件)

答案 1 :(得分:0)

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

def destroy
  current_user.authentications.destroy_all
end

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

<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参数。