2017-02-24 53 views
1

您好我想通过嵌套的形式在我的Rails 5应用程序中实现has_many:创建一个用户分配给它的项目。然而,当我试图创建项目时,我面临以下验证错误:has_many的不允许参数:通过Rails 5中的嵌套窗体

- Project users user company must exist 
- Project users user email can't be blank 
- Project users user email is invalid 
- Project users user password can't be blank 
- Project users user firstname can't be blank 
- Project users user lastname can't be blank 

这是验证我没有为用户模型,但我不明白为什么当我创建嵌套用户一个项目,他们出现。另外,控制台显示:fullname作为不允许的参数,如下所示。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"3RtrzKKVrSOiGLYnHwubF3GaRAbcQE/61doRM5clT8GpFYeJoEVnU2lEmQsNwVO8qecdqig8xjwbTqqaqL1gYQ==", "project"=>{"name"=>"dsada", "description"=>"dadasd", "project_users_attributes"=>{"0"=>{"user_attributes"=>{"fullname"=>["", "5", "4", "3"]}}},"choice"=>"1", "button"=>"", "company_id"=>"1"} 
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]] 
Company Load (0.3ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
Unpermitted parameter: fullname 

任何人都可以见识一下为什么我面对这些验证错误,为什么全名我虽然项目包括他们坚强params为考虑不允许的?我的代码如下所示。谢谢!

#Model - project.rb 
class Project < ApplicationRecord 
    has_many :project_users, inverse_of: :project 
    has_many :users, through: :project_users 
    accepts_nested_attributes_for :project_users 
end 

#Model - project_user.rb 
class ProjectUser < ApplicationRecord 
    belongs_to :project, inverse_of: :project_users 
    belongs_to :user, inverse_of: :project_users 
    accepts_nested_attributes_for :user 
end 

#Model - user.rb 
class User < ApplicationRecord 
    has_many :project_users, inverse_of: :user 
    has_many :projects, through: :project_users 
end 

#Controller - projects_controller.rb 
class ProjectsController < ApplicationController 
    def new 
    @company = Company.find(params[:company_id]) 
    @project = @company.projects.build 
    @project.project_users.build.build_user 
    end 

    def create 
    @company = Company.find(params[:company_id]) 
    @project = @company.projects.build(proj_params) 
    if @project.valid? 
     @project.save 
     render 'show' 
    else 
     render 'new' 
    end 
    end 

    private 
    def proj_params 
     params.require(:project).permit(:name, :description, project_users_attributes: [:id, user_attributes:[:fullname]]) 
    end 
    end 
end 

#Views - new.html.erb 

<%= form_for [@company, @project] do |f| %> 
    <%= f.label :title %> 
    <%= f.text_field :name %> 
    <%= f.label :description %> 
    <%= f.text_area :description %> 
    <%= f.fields_for :project_users do |project_user_form| %> 
    <%= project_user_form.fields_for :user do |user| %> 
     <%= user.label :team_members %> 
     <%= user.select :fullname, company.users.collect { |p| [ p.fullname, p.id ] }, {:prompt => 'Select Team Members'}, { :multiple => true} %> 
    <% end %> 
    <% end %> 
    <%= f.button :submit => "" %> 
<% end %> 

回答

0

好的。

首先,我会解释为什么你的强参数不能很好地工作。 你实际上在proj_params中表示:fullname实际上是一个字段。但它不只是一个领域 - 它是一系列价值观。因此,如果您将其更改为允许参数的:fullname => []

但是.. 这没有任何意义。 您的代码正在尝试创建新用户,未分配他们。这就是为什么你会得到验证错误。最简单的方法是通过用户的ID - 它会尝试更新/建立关联,而不是创建。 然后,您最好从视图中传递用户的ID。尝试通过user_ids而不是全名,不要忘记user_ids => []强参数。 希望这会有所帮助。

+0

嘿@vladimir,谢谢!我是否这样做? (:project).permit(:name,:description,project_users_attributes:[:id,user_attributes:[:fullname]]) **至** params.require name,:description,project_users_attributes:[:id,user_attributes:[:user_ids => []]]) –

+0

@KengHong是的,就像那样。 –

+0

感谢您的帮助!然而,当我采纳你的建议时,我得到以下错误: - **未定义的局部变量或方法'user_ids'为#你的意思是? USER_SESSION **。 有什么我错过了吗? –

相关问题