2016-11-11 9 views
1

私は現在、私の会社の請負業者システムを構築しており、私はサインアップシステムにdeviseを使用することに決めました。各請負業者には、多くのツールが割り当てられ、その逆もあります。ユーザーにフォームが、私は、ユーザーが、何にも1つのツールassineすることができますサインアップ私はこの複数のデータを結合データベースに入力するにはどうすればいいですか?

<% for tool in Tool.all %> 
         <div> 
          <%= check_box_tag "user[tool_ids]", tool.id, @user.tools.include?(tool.id) %> 
          <%= tool.name %> 
         </div> 
         <% end %> 

       </div> 

を使用していた私のサインアップフォームインチそうtheroyに私は

@user.tools << Tool.find(1) 
@user.tools << Tool.find(2) 
@user.tools << Tool.find(3) 
@user.tools << Tool.find(4) 

をしたい私は、ユーザーがサインアップに望む限り多くのツールを中に追加し、そのテーブルに

を割り当てるできるようにすることができますどのようにサインアップフォームを使用して

申し込み手続きの中で

誰にでもアイデアがありますか?

+0

を許可することを可能にする必要があります

<% for tool in Tool.all %> <div> <%= check_box_tag "user[tool_ids][]", tool.id, @user.tools.include?(tool.id) %> <%= tool.name %> </div> <% end %> </div> 

ここに1つの方法ですユーザコントローラの新しいアクションでは、ツールを持つのと同じくらい多くの関連する結合オブジェクトをユーザ用に構築します。 form_for userとfields_for:some_join_objectsの組み合わせを使用すると、自動的に結合オブジェクトがフォームに挿入されます。結合オブジェクトの選択可能な属性の一部が拒否されている場合は、reject_fを返します。 – eeeeeean

答えて

0

あなたのフォームは(おそらく、あなたが示されていない他のデータを含む)は、このように見えるのparamsの上送信している:

{ 
    user: { 
    tool_ids: [] 
    } 
} 

をコントローラでは、tool_ids配列を確認したもののみが含まれます。ですから、このような何かを行うことができます。

# create join records 
params[:user][:tool_ids].each do |tool_id| 
    UsersTools.create(tool_id: tool_id, user_id: @user.id) 
end 

# reload the in-memory user object to reflect the db 
# no need to do this if you're redirecting 
@user.reload 
0

その後、配列にとる代わりにこれを使用する私はあなたの形でこの

を行うための良い方法を発見しました。 accepts_nested_attributes_forユーザー::(reject_if引数付き)some_join_objectsあなたは、あなたのアプリケーションのコントローラに行うと工夫のための強力なパラメータは、特定のフィールドの配列

def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up) do |user_params| 
    user_params.permit({ tool_ids: [] },:email, :password, :password_confirmation) 
    end 
end 
関連する問題