Unable to connect Devise User to ProfilesController

The normal devise routes work users_sign_out_path, edit_user_registration_path, etc I can't seem to route to the controller for profiles. I'd like to use the index/show actions to display the user profile publicly.

Here is my controller setup.

class ProfilesController < ApplicationController   before_action :set_profile, only: [:show, :edit, :update, :destroy]

  # GET /profiles   # GET /profiles.json   def index     @profiles = Profile.all   end

  # GET /profiles/1   # GET /profiles/1.json   def show     @user = User.find(params[:id])

    respond_to do |format|       format.html       format.json {render :json => @user }     end   end

  # GET /profiles/1/edit   def edit   end

  # PATCH/PUT /profiles/1   # PATCH/PUT /profiles/1.json   def update     respond_to do |format|       if @profile.update(profile_params)         format.html { redirect_to @profile, notice: 'Profile was successfully updated.' }         format.json { render :show, status: :ok, location: @profile }       else         format.html { render :edit }         format.json { render json: @profile.errors, status: :unprocessable_entity }       end     end   end

  # DELETE /profiles/1   # DELETE /profiles/1.json   def destroy     @profile.destroy     respond_to do |format|       format.html { redirect_to profiles_url, notice: 'Profile was successfully destroyed.' }       format.json { head :no_content }     end   end

  private     # Use callbacks to share common setup or constraints between actions.     def set_profile       @profile = Profile.find(params[:id])     end

    # Never trust parameters from the scary internet, only allow the white list through.     def profile_params       params[:profile]     end end

routes.rb resources :profiles It gives me a method undefined error when I use the links for the controller. Help me figure this out please. I'm pretty sure someone has come across this problem.

Can you show us the actual error from the console or logs? Also show us the code where you reference profiles_path and profile_path.

Without seeing this code for context, try moving 'resources :profiles' to the top of the routes file as Rais uses the first matching route and you may have a conflict.

James Davis, PhD wrote in post #1164975:

Can you show us the actual error from the console or logs? Also show us the code where you reference profiles_path and profile_path.

Without seeing this code for context, try moving 'resources :profiles' to the top of the routes file as Rais uses the first matching route and you may have a conflict.

I destroyed the ProfilesController, so that I can try a new approach. I found this solution below. Create a new UsersController with show action. resources :users

class UsersController < ApplicationController #before_filter :authenticate_user!

  def show     @user = User.find(params[:id])

    respond_to do |format|         format.html # show.html.erb         format.json { render :json => @user }     end   end end

<li><%= link_to "Profile", current_user %></li> <li><%= link_to "Settings", edit_user_registration_path %></li> <li><%= link_to "Logout", destroy_user_session_path, method: "delete" %></li> If you have a better way of solving this problem. Please, let me know. Devise comes with just about everything you might need, but adding user profiles for public and private viewing is a different story.

The solution I just posted worked. As in it shows the user profile of the person signed in. I may just have to create a ProfilesController to show other users that are signed in. The poster says.

If you want to show which users are currently logged in then why not put that in the users controller? That sounds like the most logical place to put it.

Colin

Colin Law wrote in post #1164987:

The solution I just posted worked. As in it shows the user profile of the person signed in. I may just have to create a ProfilesController to show other users that are signed in. The poster says.

If you want to show which users are currently logged in then why not put that in the users controller? That sounds like the most logical place to put it.

Colin

True. I will most likely do so. The last issue that I'm having is with the route name. It's presenting the users/:id instead of profile.

    resources :users do       get 'users/:id' => 'users#show', :as => 'profile'     end

In all truth, I'd really like to present the :username which I included during signup for normal users. They have to put both their :username and :email in. How could I show just /:username when a person routes to their own show page?

I think I must be misunderstanding the question, you can show as much or as little as you like, just put what you want in the view, and leave out what you do not want.

Colin

Colin Law wrote in post #1164989:

Have a look at the rails guide on routing, you can use match to make up any route you like.

Colin

David for the route to show up like twitter, you can use friendly_id gem. or write your own route like this

get “/:profile_id” => “profiles#show”, :as => “user_profile”, :constraints => { :profile_id => /[^/]+/ }

Vivek Sampara wrote in post #1165021:

David for the route to show up like twitter, you can use friendly_id <https://github.com/norman/friendly_id&gt; gem. or write your own route like this

get "/:profile_id" => "profiles#show", :as => "user_profile", :constraints => { :profile_id => /[^\/]+/ }

I started using this gem earlier today. It works great. All I had to do was add the :slug to the :users table and then I added the initializing statement to the user.model. I'm currently looking into social networking gems, I'm trying to pick the best one before I dive in with the project.