【问题标题】:In Ruby on Rails Restful Authentication, UsersController#new, a @user = User.new is used. Is it actually needed?在 Ruby on Rails Restful 身份验证中,UsersController#new 使用了 @user = User.new。真的需要吗?
【发布时间】:2023-03-15 00:59:01
【问题描述】:

之后

script/generate authenticated user sessions

users_controller.rb 是用

创建的
def new
  @user = User.new
end

视图有这一行:

@user.password = @user.password_confirmation = nil

就是这样。这真的需要吗?我的意思是表单将通过 RESTful 路由发送到 /users,然后发送到 UsersController#create,因此实际上创建的 @user 从未使用过。它真的需要吗?为什么?谢谢。


更新: @user 再也不会在其他任何地方使用...另外,我尝试删除这两行

@user = User.new

@user.password = @user.password_confirmation = nil

我仍然可以使用表单来创建新用户...

【问题讨论】:

    标签: ruby-on-rails restful-authentication


    【解决方案1】:

    在视图中它是有道理的。假设用户帐户创建失败 - 您将使用不同的(不是新的)@user 对象重新呈现 new 视图。我可能会在操作中重置密码和密码确认。

    【讨论】:

    • hm...你的意思是,假设登录名或电子邮件是否已经注册,并且它不会通过验证,它不会再次进入控制器而是重新渲染视图...而且我们不想使用已经填写在表单中的密码来渲染视图...所以我们使用@user.password = @user.password_confirmation = nil 行来清除密码——纯粹是为了验证失败的目的.. . 实际上,<% form_for :user, :url => users_path do |f| -%> 将使用其他值预先填写表单...所以:user@user 一样好...
    • 看起来如果 @user 没有创建,form_for 将创建它......如果已经创建,那么就不会费心创建它......为了清除密码字段,它必须在控制器中创建......除非在视图中我们说@user.password = @user.password_confirmation = nil if (defined? @user) && !@user.nil?
    • 你几乎拥有它 - 我的意思是如果需要,我会在控制器而不是视图中清除密码。从您所看到的情况来看,“新”new 请求似乎不需要 @user,但是 @user 将用于创建失败的用户。要尝试此操作,请将控制器中的 @user 重命名为其他名称,然后查看您的视图在用户帐户创建失败时的行为。
    • 如果我在控制器中删除它,那么当应该显示注册表单时视图会显示undefined method password_confirmation= for nil:NilClass...但是如果我已经有无效字段然后重命名为@user2在控制器中,视图实际上呈现正常...如果我在视图中删除将密码设置为 nil 的那一行,那么它会产生不希望的效果,即不清除密码并且在表单中,可在 HTML 源代码中查看...但是...实际上表单是在 HTTP 中提交的,所以无论如何这些密码对于任何网络拦截器都是可见的...预先填写应该可以吗?
    【解决方案2】:

    需要在视图上呈现正确的表单。表单可以说它是否只是未保存的对象,就像这里一样,所以表单会创建发布请求。如果是在 DB 中找到的用户,则会自动创建 PUT 请求进行更新。

    <%= form_for @user do |f| %>
      <%#= something %>  
    <% end %> 
    

    如果您在控制器 User.new 或 User.find(id) 中执行此操作,它的行为会有所不同

    【讨论】:

    • 它正在使用&lt;% form_for :user, :url =&gt; users_path do |f| -%&gt;...@user 从未在其他任何地方再次使用过...另请参阅问题中的更新#1
    猜你喜欢
    • 2011-07-06
    • 2014-03-10
    • 2011-02-02
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2018-04-27
    相关资源
    最近更新 更多