Commit 8be0dbb

mo khan <mo@mokhan.ca>
2016-05-28 14:38:43
update gyms#create to create a gym using the yelp id.
1 parent cd79878
app/controllers/gyms_controller.rb
@@ -21,9 +21,13 @@ class GymsController < ApplicationController
   end
 
   def create
-    @gym = Gym.new(secure_params)
+    @gym = build_gym
+
     if @gym.save
-      redirect_to gyms_path(q: @gym.name)
+      respond_to do |format|
+        format.html { redirect_to gyms_path(q: @gym.name) }
+        format.js { render @gym }
+      end
     else
       flash[:error] = @gym.errors.full_messages
       render :new
@@ -39,4 +43,12 @@ class GymsController < ApplicationController
       location_attributes: [:address, :city, :region, :country, :postal_code]
     )
   end
+
+  def build_gym
+    if params[:yelp_id].present?
+      @gym = Gym.create_from_yelp!(params[:yelp_id])
+    else
+      @gym = Gym.new(secure_params)
+    end
+  end
 end
app/controllers/profiles_controller.rb
@@ -12,12 +12,7 @@ class ProfilesController < ApplicationController
 
   def update
     profile = current_user.profile
-    ActiveRecord::Base.transaction do
-      if params[:home_gym_yelp_id].present?
-        profile.gym = Gym.create_from_yelp!(params[:home_gym_yelp_id])
-      end
-      profile.update(profile_params)
-    end
+    profile.update(profile_params)
     flash[:notice] = t("profiles.edit.profile_update_success")
     redirect_to profile_path(profile)
   end
@@ -25,6 +20,6 @@ class ProfilesController < ApplicationController
   private
 
   def profile_params
-    params.require(:profile).permit(:gender, :social_tolerance, :time_zone)
+    params.require(:profile).permit(:gender, :social_tolerance, :time_zone, :gym_id)
   end
 end
app/models/gym.rb
@@ -65,7 +65,7 @@ class Gym < ActiveRecord::Base
   end
 
   def self.create_from_yelp!(id)
-    Gym.find_by(yelp_id: id) || Gym.map_from(::Yelp.client.business(id).business).save!
+    Gym.find_by(yelp_id: id) || Gym.map_from(::Yelp.client.business(id).business)
   end
 
   def self.import(city, pages: 5)
app/models/profile.rb
@@ -3,7 +3,6 @@ class Profile < ActiveRecord::Base
   belongs_to :gym
   enum social_tolerance: { low: 0, medium: 1, high: 2 }
   enum gender: { female: 0, male: 1, transgender: 2, other: nil }
-  attr_accessor :home_gym
 
   def to_param
     user.username
app/views/gyms/_gym.jbuilder
@@ -0,0 +1,5 @@
+json.yelp_id gym.yelp_id
+json.name gym.name
+json.full_address gym.full_address
+json.latitude gym.location.latitude
+json.longitude gym.location.longitude
app/views/gyms/create.json.jbuilder
@@ -0,0 +1,3 @@
+json.gym do
+  json.partial! 'gym', gym: @gym
+end
app/views/gyms/index.json.jbuilder
@@ -1,7 +1,3 @@
-json.array! @gyms do |gym|
-  json.yelp_id gym.yelp_id
-  json.name gym.name
-  json.full_address gym.full_address
-  json.latitude gym.location.latitude
-  json.longitude gym.location.longitude
+json.gyms @gyms do |gym|
+  json.partial! 'gym', gym: gym
 end
app/views/profiles/edit.html.erb
@@ -23,8 +23,8 @@
       </fieldset>
       <fieldset>
         <legend><%= Profile.human_attribute_name(:home_gym) %></legend>
-        <p id="home_gym_name"><%= @profile.home_gym %></p>
-        <%= hidden_field_tag(:home_gym_yelp_id) %>
+        <p id="home_gym_name"><%= @profile.gym.try(:name) %></p>
+        <%= f.hidden_field(:gym_id) %>
         <a href="#" data-reveal-id="homeGymModal">Choose Home Gym</a>
       </fieldset>
       <%= f.submit t(".save"), class: "button"  %>
spec/controllers/gyms_controller_spec.rb
@@ -82,6 +82,28 @@ describe GymsController do
         expect(gym.location.country).to eql("CA")
         expect(gym.location.postal_code).to eql("T2M 0L4")
       end
+
+    end
+
+    context "with the yelp id" do
+      render_views
+
+      let(:yelp_id) { 'sait-campus-centre-calgary'}
+      let(:gym) { build(:gym, yelp_id: yelp_id) }
+
+      before :each do
+        allow(Gym).to receive(:create_from_yelp!).
+          with(yelp_id).
+          and_return(gym)
+      end
+
+      it 'returns a json response' do
+        xhr :post, :create, yelp_id: yelp_id
+        json = JSON.parse(response.body)
+        expect(json['yelp_id']).to eql(yelp_id)
+        expect(json['name']).to eql(gym.name)
+        expect(json['full_address']).to eql(gym.full_address)
+      end
     end
 
     context "invalid params" do
spec/controllers/profiles_controller_spec.rb
@@ -52,11 +52,10 @@ describe ProfilesController do
       end
 
       it 'saves the users home gym' do
-        gym = create(:gym, yelp_id: 'sait-campus-centre-calgary')
+        gym = create(:gym)
 
         patch :update, id: user.to_param,
-          profile: { time_zone: 'Alaska' },
-          home_gym_yelp_id: gym.yelp_id
+          profile: { time_zone: 'Alaska', gym_id: gym.id }
 
         expect(user.reload.profile.gym).to eql(gym)
       end