In part one we installed and configured the FatSecret gem. In part two, we’ll explore ways to call the FatSecret API.
Also, you’ll need to make sure you’re using the latest version of the fatsecret-omniauth gem. The current version at the time of this blog post is 0.0.2.
We created the ApiTokens controller in Part One for obtaining and saving FatSecret auth tokens. Now, we need a controller to handle api requests. Open your app folder in a console window and type the following:
rails g controller Apis fatsecret
Edit the new app/controllers/apis_controller.rb
:
class ApisController < ApplicationController
def fatsecret
tokens = {}
unless params[:user_id].nil?
user = User.find(params[:user_id])
tokens = user.api_tokens.find_by_provider('fatsecret')
end
request = Fatsecret::Api.new({}).api_call(
'FATSECRET_KEY',
'FATSECRET_SECRET',
params,
tokens['auth_token'] ||= "",
tokens['auth_secret'] ||= ""
)
@response = request.body
end
end
Create a new route for the apis#fatsecret method above all other routes in config/routes.rb
:
post "/fatsecret", to: "apis#fatsecret"
The apis#fatscret method provides a way to make any FatSecret API request. You only need to include your FatSecret query in a params hash, and send this to api#fatsecret. See the FatSecret API method docs for details on what parameters are required for each FatSecret API method.
To test this, let’s create a form to use the foods.search method without user authentication:
Edit app/views/home/index.html.erb
to include a search form:
<h3>Home</h3>
<h1>Try FatSecret Food Search</h1>
<%= form_tag fatsecret_path %>
<%= label_tag(:search_expression, "Search for food:") %>
<%= text_field_tag(:search_expression) %>
<%= hidden_field_tag 'method', 'foods.search' %>
<%= submit_tag("Search") %>
<% end %>
<% @users.each do |user| %>
<p>User: <%= link_to user.name, user %></p>
<% end %>
Edit app/views/apis/fatsecret.html.erb
:
<h1>Apis#fatsecret</h1>
<pre><%= @response %></pre>
If everything worked as expected you should see something like my search for ‘banana’ above.
Awesome. Now, let’s tie everything together and make an authenticated API call using the using the auth_token and auth_secret we obtained in Part 1 of this blog post.
First, add a new route for authenticated API calls below post "/fatsecret", to: "apis#fatsecret"
in config/routes.rb
:
post "/users/:user_id/fatsecret", to: "apis#fatsecret", as: "fatsecret_auth"
Edit app/views/users/show.html.erb
:
<h3>User</h3>
<p>User: <%= @user.name %></p>
<p>Email: <%= @user.email if @user.email %></p>
<h4>Your APIs</h4>
<ul>
<% user_apis = [] %>
<% @user.api_tokens.each do |api| %>
<li><b><%= api.provider.camelize %>:</b></li>
<% user_apis << api.provider %>
<% end %>
<% if user_apis.include?('fatsecret') %>
<%= link_to "Get FatSecret Profile", fatsecret_auth_path(@user, :method => 'profile.get'), :method => 'post' %>
<% else %>
<%= link_to 'Add FatSecret', new_user_api_token_path(@user) %>
<% end %>
</ul>
That’s it. We made authenticated and unauthenticated calls to the FatSecret API. We used a form for one and a link for the other. Going forward, all you need to do is read the FatSecret API docs and make sure to include all required FatSecret method parameters in the params hash you send to the apis#fatsecret method.
Here’s an example of posting data to a user’s FatSecret account via an authenticated api call. This follows the same pattern as before. Read the API docs and include the required parameters in the params hash.
Add this form below the ‘Get FatSecret Profile’ link in app/views/users/show.html.erb
:
<p>
<h3>Update your weight on FatSecret:</h3>
<%= form_tag fatsecret_auth_path(@user) do %>
<%= label_tag(:goal_weight_kg, "Enter your goal weight in kg:") %>
<%= text_field_tag(:goal_weight_kg) %><br />
<%= label_tag(:current_height_cm, "Enter your current height in cm:") %>
<%= text_field_tag(:current_height_cm) %><br />
<%= label_tag(:current_weight_kg, "Enter your current weight in kg:") %>
<%= text_field_tag(:current_weight_kg) %><br />
<%= hidden_field_tag 'method', 'weight.update' %>
<%= submit_tag("Update Weight") %>
<% end %>
</p>