2017-02-24 17 views
1

こんにちは私は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 

これらは、私はユーザモデルのためにした検証のですが、私は、ネストされたユーザーとプロジェクトを作成するときに、彼らが表示される理由を私は理解していません。また、コンソールには、以下に示すように、許可されていないパラメータとしてのフルネームが示されています。

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、ありがとうございます!私はこれを好きですか? params.require(:project).permit(:name、:description、project_users_attributes:[:id、user_attributes:[:fullname]] ** to ** params.require(:project).permit(:説明:project_users_attributes:[:id、user_attributes:[:user_ids => []]] –

+0

@KengHongはい、そうです。 –

+0

ご協力いただきありがとうございます!私はあなたの提案を採用するとき、私は次のエラーが表示されます: - **未定義のローカル変数またはメソッドのための 'user_ids '#意味ですか? user_session ** 私は何かを逃したのですか? –

関連する問題