【问题标题】:Newly added column's data not being saved to DB新添加的列数据未保存到数据库
【发布时间】:2014-05-04 18:01:41
【问题描述】:

我在我的 Rails 4 应用程序中使用 Devise 进行用户身份验证。最近我在 User 模型中添加了两个新列。它们是first_namelast_name. 然后我用这两个属性的字段更新了登录表单。但是,当我测试创建新用户时,两者都没有保存到数据库中。我认为这可能是一个批量分配问题,但我没有收到任何类型的数据库错误。用户已成功创建,但仅存储原始属性(电子邮件、密码和密码确认)。任何人都可以帮忙吗?

这是我的表单的代码:

<div class="row">
  <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <div class="small-10 small-offset-0 columns">

    <div class="row">
      <div class="small-2 columns">
        <%= f.label :first_name, class: 'right inline' %>
      </div>
      <div class="small-4 columns">
        <%= f.text_field :first_name, id: 'right-label' %>
      </div>
      <div class="small-6 columns">
        <!-- empty space -->
      </div>
    </div>

    <div class="row">
      <div class="small-2 columns">
        <%= f.label :last_name, class: 'right inline' %>
      </div>
      <div class="small-4 columns">
        <%= f.text_field :last_name, id: 'right-label' %>
      </div>
      <div class="small-6 columns">
        <!-- empty space -->
      </div>
    </div>

    <div class="row">
      <div class="small-2 columns">
        <%= f.label :email, class: 'right inline' %>
      </div>
      <div class="small-4 columns">
        <%= f.email_field :email, id: 'right-label' %>
      </div>
      <div class="small-6 columns">
        <!-- empty space -->
      </div>
    </div>

    <div class="row">
      <div class="small-2 columns">
        <%= f.label :password, class: 'right inline' %>
      </div>
      <div class="small-4 columns">
        <%= f.password_field :password, id: 'right-label' %>
      </div>
      <div class="small-6 columns">
        <!-- empty space -->
      </div>
    </div>

    <div class="row">
      <div class="small-2 columns">
        <%= f.label :password_confirmation, class: 'right inline' %>
      </div>
      <div class="small-4 columns">
        <%= f.password_field :password_confirmation, id: 'right-label' %>
      </div>
      <div class="small-6 columns">
        <!-- empty space -->
      </div>
    </div>

    <div class="row">
      <div class="small-2 columns">
        <!--placeholder -->
      </div>
      <div class="small-10 columns">
        <%= f.submit "Create account", class: 'button small' %>
      </div>
    </div>

    <div class="row">
      <div class="small-2 columns">
        <!--placeholder -->
      </div>
      <div class="small-10 columns">
        <%= render "devise/shared/links" %>
      </div>
    </div>
  </div>

  <div class="small-3 columns">
    <!-- nothing here -->
  </div>
  <% end %>

</div>

控制台上的模型信息显示已添加属性:

User(id: integer, email: string, encrypted_password: string, reset_password_token: string, reset_password_sent_at: datetime, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime, first_name: string, last_name: string) 

【问题讨论】:

  • 发布您的controller 代码。
  • 由于我使用的是 Devise,我实际上并没有看到它在我的应用程序中使用的 RegistrationsController。但它在 GitHub:github.com/plataformatec/devise/blob/master/app/controllers/…
  • 为什么不为您的用户创建个人资料?这种方式(为每个用户创建配置文件)比将列添加到数据库非常优化。无论如何,如果要添加列,则必须覆盖设计控制器。我希望this link 有用。

标签: ruby-on-rails forms authentication ruby-on-rails-4 devise


【解决方案1】:

根据 Rails 4 的强参数,您需要让设计人员知道现在允许使用这些新参数。您可以将以下内容添加到您的应用程序控制器中:

class ApplicationController < ActionController::Base  
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
     devise_parameter_sanitizer.for(:sign_up) << :first_name << :last_name
  end
end

有关在设计中使用 Rail 4 的强参数的更多信息,请参阅Devise README强参数部分。

【讨论】:

  • 谢谢!看来我最初的怀疑是正确的。我刚才还在控制台中进行了检查,可以看到它在插入数据库之前确实显示了“未经许可的参数:first_name,last_name”。尝试分配受保护的属性时,我不应该在网站本身上收到错误吗?
  • 不,我认为您不应该在网站上这样说时出现错误,因为它会将数据库中的内容暴露给最终用户。但没问题,我很高兴能帮上忙!
  • 我遇到了类似的问题,这个答案让我检查了我的模型控制器中的 param.require 语句。结果我需要将新模型列名称添加到 params.require 语句中。现在所有工作:)
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多