Rendering different values depending on a state of repository

Hi,

I am displaying users cpm based on their submitted form. It all works until I am creating a new user who doesn’t have such cpm yet. Then I get an error. I understand that I need to use case in which I check either there is a cpm or not, if not I return a link to needed form. I was wondering how to do it, as I am not sure what I should write in such case.

My page_controller:

def index(conn, _params, current_user) do
   user = current_user.id
   user_pps = Cpm.list_user_pp(current_user)
   user_pp = Cpm.get_user_pp!(current_user, user)
   user_bmr = Bmr.bmr_for_user(user_pp)
   user_cpm = Float.floor(Bmr.cpm_for_user(user_pp, user_bmr))
   
   case user_cpm do
     {:ok} -> returns first cpm
     {:error} -> returns a link to a form
   render(conn, "index.html", user: user, userp_pps: user_pps, user_cpm: user_cpm)

Thanks for help!

You can always redirect in case there is no user_cpm.

Another way is to use a conditional in the template… like this.

if assigns[:user_cpm] do
  -> usual stuff when there is a user_cpm
else
  -> display link to form
end

You case miss an end :slight_smile:

Thanks for the reply!

What if I don’t want to redirect from start? I want to keep a user on the front page so he has access to different things, only if he wants to he can click a button to redirect to my form

Then try the code I put in my last post :slight_smile:

I have tried your recommendation but I guess I am doing something wrong. I will be very grateful for your help.

This is my template now:

<h2>Your Profile</h2>
          <ul>
          <%= if @current_user do %>
            <%= if assigns[:user_cpm] do %>
              -> <h2 style = "position:absolute; left:350px; top:275px;">User CPM: <br> <%= @user_cpm %></h2>
            <% else %>
              -> <%= link "Create Cpm", to: Routes.physical_profile_path(@conn, :new) %>%
          <% end %>
            <li>
              <%= link "Your Cpm", to: Routes.physical_profile_path(@conn, :index) %>
            </li> 
            <li>
              <%= link "Users", to: Routes.user_path(@conn, :index) %>
            </li>
            <li>
              <%= link "Foods", to: Routes.food_path(@conn, :index) %> 
            </li>
          <% end %>
          </ul>

What I get when I try to visit my main page is:


UndefinedFunctionError at GET /
function nil.id/0 is undefined

I suspect that it’s not even getting to my user_cpm variable as it doesn’t have a value in user variable in my controller as there is no users in db.

Try replacing @current_user with assigns[:current_user]

The first will fail if not set, the second will return nil.

You cannot use variable that have not been set.

If current_user is not set, it will fail with the error You see…

1 Like

So if I can’t use variable that have not been set yet, what can I do? Use case?

No, use assigns[:current_user] in the template…

or test that the value exists.

You cannot use current_user.id if it is not set.

Thank you for help. I managed to resolve my issue by using case