嵌套形式的未定义方法“remember_me”

Undefined method `remember_me' in nested form for

我正在按照 Michael Hartl 的教程进行操作,但是当我 运行 bundle exec rake 测试时出现此错误:

1) Error:
UsersControllerTest#test_should_get_new:
ActionView::Template::Error: undefined method `remember_me' for #<User:0x000000058544b8>
    app/views/users/new.html.erb:25:in `block (2 levels) in _app_views_users_new_html_erb__1810619291483938060_46219160'
    app/views/users/new.html.erb:24:in `block in _app_views_users_new_html_erb__1810619291483938060_46219160'
    app/views/users/new.html.erb:6:in `_app_views_users_new_html_erb__1810619291483938060_46219160'
    test/controllers/users_controller_test.rb:6:in `block in <class:UsersControllerTest>'


  2) Error:
UsersSignupTest#test_invalid_signup_information:
ActionView::Template::Error: undefined method `remember_me' for #<User:0x00000006acef08>
    app/views/users/new.html.erb:25:in `block (2 levels) in _app_views_users_new_html_erb__1810619291483938060_46219160'
    app/views/users/new.html.erb:24:in `block in _app_views_users_new_html_erb__1810619291483938060_46219160'
    app/views/users/new.html.erb:6:in `_app_views_users_new_html_erb__1810619291483938060_46219160'
    test/integration/users_signup_test.rb:6:in `block in <class:UsersSignupTest>'


  3) Error:
UsersSignupTest#test_valid_signup_information:
ActionView::Template::Error: undefined method `remember_me' for #<User:0x000000074f6ff8>
    app/views/users/new.html.erb:25:in `block (2 levels) in _app_views_users_new_html_erb__1810619291483938060_46219160'
    app/views/users/new.html.erb:24:in `block in _app_views_users_new_html_erb__1810619291483938060_46219160'
    app/views/users/new.html.erb:6:in `_app_views_users_new_html_erb__1810619291483938060_46219160'
    test/integration/users_signup_test.rb:17:in `block in <class:UsersSignupTest>'

这是 new.html.erb 文件:

<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.label :remember_me, class: "checkbox inline" do %>
        <%= f.check_box :remember_me %>
        <span>Remember me on this computer</span>
      <% end %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

^就像rails教程中的清单8.47 https://www.railstutorial.org/book/log_in_log_out

好像rails认为:remember_me是一个方法,但是为什么呢???为什么 :remember_me 被认为是一种方法,而所有其他标签都不是???我他妈的不明白。

背景:我经历了半个ruby教程并进入了这个rails教程。我有非常基本的 html 和 css 能力。以前从未接触过 ruby。而且这一章有一半的概念我真的不明白。我主要只是按照说明进行操作。所以,请用新手的术语解释 :)

清单 8.47 中的表单用于会话:

<%= form_for(:session, url: login_path) do |f| %>

但是您的表格是给用户的:

<%= form_for(@user) do |f| %>

form_for 助手 binds a form to an object。当该对象是模型的实例时,如 @user、rails 期望每个标签和字段都是该模型的属性。由于 remember_me 不是 User 的属性,因此会出现错误。您可以通过向用户模型添加虚拟属性来解决此问题:

class User < ActiveRecord::Base
  attr_accessor :remember_me
  ...

这允许您在用户表单中使用 remember_me,并在提交表单时将 params[:user][:remember_me] 发送到您的用户控制器。

您将 'check box' 代码放入 app/views/users/new.html.erb,这是 注册 的视图模板,而不是登录。

要使代码正常工作,请将 check box 代码放入 Login 视图模板中,即 app/views/sessions/new.html.erb.