我正在尝试实现此处列出的覆盖方法Devise- Override Confirmation。我的rails版本是4,ruby是2.0。我的实现涉及多个资源,因此我将此覆盖编码为特定资源,即骑手。
show动作正确呈现,我可以输入我的密码。但是当我提交表单时,我收到以下错误消息
First argument in form cannot contain nil or be empty
我使用带有@confirmable and self.resource
监视器的调试器遍历代码,这些监视器分别在控制器的with_unconfirmed_confirmable and do_show
方法中设置,并且似乎在do_show方法中同时渲染show模板时@确认和self.resource设置为试图确认的用户。但是,在更新确认时,两者都设置为nil。
由于代码相当长,我将控制器,显示模板和设计相关代码放在gist中。
编辑以回应评论
我将确认令牌作为隐藏字段存储在表单中。它被设置为正确的值(当我用它来查询db时,我得到了我期望的用户)。
再次使用调试器遍历它时,我注意到在更新操作期间确认令牌的值似乎重新生成了不同的toke,但它在请求参数中是正确的。
{"rider"=>{"confirmation_token"=>"92f786e5270e3562aa48589cc6c36e083cc7a23a41bb55f92c338f381050ec8b"}, "commit"=>"Activate", "controller"=>"riders/confirmations", "action"=>"update"}
因为@confirmable被设置为nil。
所以现在我想知道为什么 @confirmation_token = Devise.token_generator.digest(User,:confirmation_token,@ original_token)在更新时生成一个全新的令牌,当@original_token的值看起来相同时(基于我的调试器中的监视)。
答案 0 :(得分:0)
我通过使用hidden_field_tag而不是f.input在隐藏字段中设置确认令牌,为非默认用户工作。这样做可以防止在更新期间覆盖confirmation_token。我已经更新了要点,以反映这些变化。