我有两种类型的用户:普通用户和专业人士。
优点是用户,但在名为: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
答案 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_parameters方法中将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 inheritance和delegations
,您可以使用以下格式进行更好(特别是从长远来看)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
虽然可以将Pro
和ProInfo
之间的关系放在一起,但如果用户能够丢失(并重新获得),请将其保留在基类上他们的职业地位。这将阻止ex-Pros的UserInfo中的孤立记录。
这也会带来更好的数据隔离和响应时间,因为很多时候你不需要很多字段被移动到一个单独的表中,可以根据需要加入。