我目前正在尝试使用一些嵌套属性创建一个设计用户。每个User
has_many :companies
以及accepts_nested_attributes_for :companies
。当管理员将用户添加到系统时,我想自动创建相应的Company
并在用户注册表单中获取一些基本信息。这意味着我在表单中嵌套了一些Company
字段。
问题是,虽然我能够很好地创建用户,但嵌套公司会被错误拒绝。
未经许可的参数:公司
application_controller.rb 注意:companies_params
就在那里,看看是否需要(我实际上并不知道是否有必要)
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) {|u|
u.permit(:password, :password_confirmation, :current_password, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])}
devise_parameter_sanitizer.for(:sign_up) {|u|
u.permit(:password, :password_confirmation, :current_password, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])}
end
users_controller.rb
def new
@user=User.new
@company=@user.companies.build
end
def create
@user = User.new(user_params)
if @user.save
redirect_to users_admin_path(@user), notice: "User successfuly created!"
else
redirect_to welcome_index_path
end
end
private
def user_params
params.require(:user).permit(:id, :email, :role, :password, :password_confirmation, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])
end
_form.html.erb
<%= simple_form_for @user, url: url_for(action: 'create', controller: 'users') do |f| %>
<fieldset>
<ol>
<li class="required">
<%= f.label :email %>
<%= f.email_field :email, size: 40 %>
</li>
<li class="required">
<%= f.label :password %>
<%= f.password_field :password, size: 40 %>
</li>
<li class="required">
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, size: 40 %>
</li>
</ol>
<%= f.simple_fields_for @company do |company| %>
<div class="field">
<%= company.input :name, label: "Name" %>
</div>
<% end %>
<%= f.submit "Create Account" %>
</fieldset>
<% end %>
任何想法都会有所帮助。
答案 0 :(得分:0)
原来我在:companies
嵌套simple_fields_for
的方式存在问题。
原来只能使用
<%= f.simple_fields_for :companies do |company| %>
或强>
<%= f.simple_fields_for @user.companies do |company| %>
但从不
<%= f.simple_fields_for @company do |company| %>
答案 1 :(得分:0)
<强>物件强>
为了给你一些上下文,你必须记住,当你使用form_for
时,它的目标是建立一个单独的对象(在这种情况下,@user
)。
使用f.fields_for
时,您正在调用此对象的嵌套属性。
因此,您必须调用fields_for
作为父对象的一部分。您的通过@company
将无法正常运作;你需要调用父对象的嵌套元素,这就是为什么只有以下工作:
<%= f.fields_for :companies ... %>
<%= f.fields_for @user.companies .... %>
这当然必须伴随build
命令 - 在控制器中构造嵌套对象,你已经完成了......
def new
@user = User.new
@user.companies.build
end
-
如果答案过于宽泛,我会删除这个答案 - 我觉得为任何可能发现这个问题的人澄清情况是正确的。