Skip to content

Instantly share code, notes, and snippets.

@tsmsogn
Last active December 15, 2015 11:09
Show Gist options
  • Select an option

  • Save tsmsogn/5250502 to your computer and use it in GitHub Desktop.

Select an option

Save tsmsogn/5250502 to your computer and use it in GitHub Desktop.
[rails]How to implement with nested resources.

Models

app/models/group.rb

class Group < ActiveRecord::Base
  attr_accessible :name
  has_many :users, dependent: :destroy
end

app/models/user.rb

class User < ActiveRecord::Base
  attr_accessible :name
  belongs_to :group
end

Routing

config/routes.rb

resources :groups do
  resources :users
end

Controllers

app/controllers/users_controller.rb

class UsersController < ApplicationController

  def new
    @group = Group.find(params[:group_id])
  end

  def create
    @group = Group.find(params[:group_id])
    @user = @group.users.build(params[:user])
    if @user.save
      flash[:success] = "User was created."
      redirect_to @group
    else
      render 'new'
    end
  end
end

Views

app/views/users/new.html.erb

<%= form_for [@group, @user] do |f| %>
  <div class="field">
    <%= f.label :name %>  
    <%= f.text_field :name %>  
  </div>
  <%= f.submit "Create User" %>
<% end %>

Tests with RSpec, Capybara and FactoryGirl

spec/factories.rb

FactoryGirl.define do
  factory :user do
    name "User example"
    group
  end

  factory :group do
    name "Group example"
  end
end

spec/requests/user_pages_spec.rb

require 'spec_helper'

describe "UserPages" do

  let(:group) { FactoryGirl.create(:group) }

  subject { page }

  describe "create page" do
    before { visit new_group_user_path(group) }

    describe "with invalid information" do
      before { click_button "Create User" }

      describe "after submission" do
        it { should have_content("error") }
      end
    end

    describe "with valid information" do
      before { fill_in "user_name", with: "Lorem ipsum" }

        it "should create a user" do
        expect { click_button "Create User" }.to change(User, :count).by(1)
      end
    end

  end

end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment