【问题标题】:Confused about strong parameters with Devise对 Devise 的强参数感到困惑
【发布时间】:2014-02-19 18:15:51
【问题描述】:

我有以下设计注册表(省略了不相关的标记):

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { id: "payment-form" }) do |f| %>
  <%= f.fields_for resource.paid_account do |pa| %>
    <%= pa.collection_select :account_plan_id, @account_plans, :id, :name_with_price %>
  <% end %>
<% end %>

此表单输出以下 HTML:

<select id="user_paid_account_account_plan_id" name="user[paid_account][account_plan_id]">
  <option value="2">Lite ($10.00/mo)</option>
  <option value="3">Professional ($20.00/mo)</option>
  <option value="4">Plus ($30.00/mo)</option>
</select>

然后我的ApplicationController 中有以下代码:

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

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) do |u|
      u.permit(
        :email,
        :password,
        :paid_account => :account_plan_id # <-- THIS IS PROBABLY WRONG
      )
    end
  end
end

当我提交表单时,我得到“PaidAccount(#2163736620) 预期,得到 ActionController::Parameters(#2173083140)”。

我也尝试了以下没有出错的方法,但它也没有创建记录:

  u.permit(
    :email,
    :password,
    :paid_account => []
  )

我做错了什么?

【问题讨论】:

  • 对我来说,它也没有像您尝试的那样工作,我不得不将消毒放在 Devise RegistrationController 中,例如:def sign_up_params params.require(:user).permit(:email, :password, :password_confirmation, :current_password, ....) end

标签: ruby-on-rails devise strong-parameters


【解决方案1】:

展示你的两个模型(UserPaidAccount,我相信)会有很大帮助。无论如何,假设UserPaidAccount 具有一对一的关系,代码应该如下所示:

class User < ActiveRecord::Base
  has_one :paid_account

  accepts_nested_attributes_for :paid_account
end

class PaidAcount < ActiveRecord::Base
  belongs_to :user
end

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

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) do |u|
      u.permit(
        :email,
        :password,
        :paid_account_attributes => :account_plan_id
      )
    end
  end
end

查看您的日志以了解表单值是如何提交的。 StrongPameters gemActive Record's Nested Attributes 的文档也应该有帮助。

【讨论】:

  • 你的回答是对的。事实证明,问题的一部分是我的表单在命名 paid_account 字段时没有 _attributes 部分,这让一切都失败了。
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2012-07-12
  • 2021-06-24
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多