アソシエーションを使用したデータ作成

アソシエーションを使用したデータ作成

ユーザー(user)が複数の掲示板(board)を所持している場合に、どのようにcreateするのか見ていきたいと思います。

New

まず、コントローラでインスタンス変数を作成します。

boards_controller.rb

def new       

 @board = Board.new

end 


フォームを作成します。

new.html.erb

<%= form_with model: @board, local: true do |f| %>                                          
<div class="form-group">                                                                    
  <%= f.label :title, t('.title') %>                                                        
  <%= f.text_field :title ,class: 'form-control', id: 'board_title' %>                      
</div>                                                                                      
<div class="form-group">                                                                    
  <%= f.label :body, t('.body') %>                                                          
  <%= f.text_area :body ,class: 'form-control', id: 'board_body', rows: 10, size: '200x8' %>
</div>                                                                                      
  <%= f.submit t('.submit'), class: 'btn btn-primary' %>                                    
<% end %>                                                                                   

※local trueをつけることで、非ajax化しています。

※model: @boardとすることで、submit押下→createメソッドに自動的に送信してくれます。

※@boardに中身が入っている場合は、自動的にupdateメソッドに送信してくれます。

※データを送信しない場合は、urlを使います。

Create

boards_controller.rb

def create                                         
  @board = current_user.boards.build(board_params) 
  if @board.save                                   
    redirect_to boards_path, success: t('.success')
  else                                             
    flash.now[:danger] = t('.fail')                
    render 'new'                                   
  end                                              
end                                                

※@boardにmergeしたり、@board.user_id = とするのはやめましょう。

※アソシエーションを使用する場合は、慣習的にbuildを使用することが多いです。

まとめ

アソシエーションの関係を意識して、コントローラを記載しよう。