blastoff
blastoff

Reputation: 31

Rails Issues with association between User and Contact

Initially started with Contacts, as expected created a list of populated contacts which correctly allow CRUD. Then set up the login with devise which created Users. When logging in as two different users each should only see their own contacts however currently users sees all the same contacts.

Any help resolving this issue would be appreciated?

(Not sure if should have started with User and then created Contact, feels like this is created backwards.)

Understanding for associations is User 'has_many :contacts' and Contacts 'belongs_to :users' have been changing and spiking to no avail.

ContactsController

class ContactsController < ApplicationController

  before_action :contact, only: [ :show, :edit, :update, :destroy]   before_action :authenticate_user!


  def index
    @contacts = Contact.all   end

  def new
    @contact = Contact.new   end

  def create
    Contact.create(contact_params)
    redirect_to '/contacts'   end

  def show   end

  def edit   end

  def update
    @contact.update(contact_params)
    redirect_to '/contacts/' + "#{@contact[:id]}"   end


  def destroy
    @contact.destroy
    redirect_to '/contacts'   end

  private

  def contact_params
    params.require(:contact).permit(:firstname, :surname, :email, :phone, :image)   end``

  def contact
    @contact = Contact.find(params[:id])   end


end

UsersController

class UsersController < ApplicationController

 end

model Contact
 class Contact < ActiveRecord::Base

   belongs_to :users

   has_attached_file :image, styles: {thumb: "100x100>"}  
 validates_attachment_content_type :image, content_type:
 /\Aimage\/.*\Z/

 end

model user

class User < ActiveRecord::Base   has_many :contacts, dependent: :destroy   devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable  end

indexhtml

<%if user_signed_in? %>   <%= link_to 'Log out', destroy_user_session_path, method: :delete %> <%end%>

<% if @contacts.any? %>   <% @contacts.each do |contact| %>   <%= link_to image_tag(contact.image.url(:thumb)), contact_path(contact) %> <h3><%= contact.firstname%> <%=contact.surname%></h3>   <%=contact.email%><br />   <%=contact.phone%>   <br />   <br />   <%end%> <%else%>   No contacts yet! <%end%> <br /> <br /> <%= link_to 'Add a contact', new_contact_path%>

show html

<p><%= image_tag @contact.image.url(:thumb) %></p> <p><%= @contact.firstname %> <%= @contact.surname %></p> <p><%= @contact.phone %></p> <p><%= @contact.email %></p>

<%= link_to 'Edit', edit_contact_path(@contact) %> <%= link_to 'Remove', contact_path(@contact), method: :delete %><br /><br /> <%= link_to 'Contacts', contacts_path %>

schema

ActiveRecord::Schema.define(version: 20160504125849) do

  # These are extensions that must be enabled in order to support this database   enable_extension "plpgsql"

  create_table "contacts", force: :cascade do |t|
    t.string   "firstname"
    t.string   "surname"
    t.string   "email"
    t.integer  "phone"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"   end

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false   end

Upvotes: 1

Views: 108

Answers (1)

Pavan
Pavan

Reputation: 33542

When logging in as two different users each should only see their own contacts however currently users sees all the same contacts

The problem is with this line @contacts = Contact.all. It holds all the contacts. As you want to display only the current_user's contacts, you just need it to below

@contacts = current_user.contacts

ActionView::Template::Error: PG::UndefinedColumn: ERROR: column contacts.user_id does not exist LINE 1: SELECT 1 AS one FROM "contacts" WHERE "contacts"."user_id" ... ^ : SELECT 1 AS one FROM "contacts" WHERE "contacts"."user_id" = $1 LIMIT 1

It seems the contacts table doesn't have user_id column. Create a new migration to add the same and do rake db:migrate

Upvotes: 1

Related Questions