添加设备自定义字段时用户的未允许参数

时间:2014-11-12 20:09:16

标签: ruby-on-rails devise

我有两种类型的用户:普通用户和专业人士。

优点是用户,但在名为:pros的单独表格中有额外的字段。

因此,我为:pros单独注册了一个表单,其中包含:用户字段,并添加了fields_for个新:pro字段。

我还将这些新参数添加到application_controller中,以便设计允许它们。

提交注册表单时,会创建用户,但我的日志中出现以下错误:

Started POST "/users" for 127.0.0.1 at 2014-11-13 00:53:43 +0100
Processing by RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"zUVLJFHhShoHvUVneGNmCf46E4KPWaINeTw4o7iCa7w=", "user"=>{"name"=>"asdasd", "email"=>"asdasd@sss.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "pros"=>{"type"=>"Marca de Decoración", "web"=>"asadasd", "telephone"=>"765876", "about"=>"sadasd"}, "tos_agreement"=>"1"}, "commit"=>"Registrarme y aplicar para PRO"}
Unpermitted parameters: pros

我的观点是:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
                <%= f.label :name, "Nombre de usuario" %>
                    <%= f.text_field :name, :autofocus => true %>
                    <%= f.label :email %>
                    <%= f.email_field :email %>
                    <%= f.label :password %>
                    <%= f.password_field :password %>
                    <%= f.label :password_confirmation %>
                    <%= f.password_field :password_confirmation %>

            <%= f.fields_for :pro do |pro| %> 
                <%= pro.select :type,["Marca de Decoración","Tienda de Decoración","Blogger"] %>
                <%= pro.text_field :web, placeholder: "http://www.miweb.com" %>
                <%= f.label :telephone, "Teléfono" %>
                <%= pro.text_field :telephone, placeholder: "Teléfono", label: "Teléfono de contacto" %>
                <%= pro.text_field :about%>
            <% end %>

用户控制器新操作

def pro_new
    render "devise/registrations/new-pro-registration"
    @user = User.create
end

我的模特关系:

User.rb

 has_one :pro
 accepts_nested_attributes_for :pro, allow_destroy: true

Pro.rb

belongs_to :user

我的应用程序控制器:

 def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :tos_agreement, :avatar, :avatar_cache, :email, :password, :password_confirmation, pros_attributes: [:pro_name, :pro_image, :is_active, :web, :user_id, :about, :facebook, :twitter, :linkedin, :telephone]) }
  end

4 个答案:

答案 0 :(得分:1)

我完全同意@ smallbutton.com 您需要更改pro_attributes而不是pros_attributes。你可以使用params.require(:user).permit!如果你想接受所有的参数。

答案 1 :(得分:1)

你有像用户has_one:pro这样的关联。

然后你在允许的参数中传递了数组,但它是has_one关系。

应该是这样的。

def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :tos_agreement, :avatar, :avatar_cache, :email, :password, :password_confirmation, pro_attributes: (:pro_name, :pro_image, :is_active, :web, :user_id, :about, :facebook, :twitter, :linkedin, :telephone)) }
end

它会起作用:)

答案 2 :(得分:0)

尝试将您的控制器更改为此,以便构建一个新的pro实例,并且您的表单助手应该生成pro_attributes。我假设这是新动作,所以你不要在你的用户上调用#create而是#new。也许您需要在allowed_pa​​rameters方法中将pros_attributes更改为pro_attributes,因为它是has_one关系。

def pro_new
    @user = User.new
    @user.build_pro
    render "devise/registrations/new-pro-registration"
end

希望这可以解决问题。

答案 3 :(得分:0)

我可以给你一个快速回答,但我认为你的设计需要一些工作。使用single table inheritancedelegations

,您可以使用以下格式进行更好(特别是从长远来看)
User #(base class)
  has_one :userInfo
  delegate :list_of_pro_fields, to: :userInfo

BasicUser < User #(sub class)

Pro < User #(sub class)
  validates presence: true, [:list_of_pro_fields]

UserInfo #(base class)
  belongs_to :user

虽然可以ProProInfo之间的关系放在一起,但如果用户能够丢失(并重新获得),请将其保留在基类上他们的职业地位。这将阻止ex-Pros的UserInfo中的孤立记录。

这也会带来更好的数据隔离和响应时间,因为很多时候你不需要很多字段被移动到一个单独的表中,可以根据需要加入。