2016-05-05 10 views
-1

Die Codebasis in "Kontakte Controller" von @contacts = Contact.all bis @contacts = current_user.contact geändert, so dass ein Benutzer nur ihre Kontakte sehen kann (derzeit sieht jeder Benutzer alle Kontakte) Dies wirft den folgenden Fehler. Versuchte Feinabstimmung, aber immer noch keinen Erfolg und haben die Datenbank in psql überprüft und beide haben ID-Spalte. Irgendwelche Ideen oder Änderungen im Code?Rails association Benutzer & Kontakte werfen Fehler

Failure/Error: <% if @contacts.any? %> 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

Kontakte-Controller Klasse ContactsController < Application

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


    def index 
    @contacts = current_user.contact 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 

Benutzer Controller

class UsersController < ApplicationController 

end 

Kontakt Modell

class Contact < ActiveRecord::Base 

    belongs_to :user 

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

end 

User-Modell

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

Index html

<%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%> 

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 

    add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 

end 
+0

'PG :: UndefinedColumn: FEHLER: Spalte contacts.user_id existiert nicht' - Der Fehler ist klar genug! Sie haben den 'Fremdschlüssel' 'user_id' nicht zu' contacts' hinzugefügt Tabelle – dp7

+0

"Der Fehler ist klar genug!" ist völlig unnötig. Oftmals ist einer anderen Person klar, was eine Person betrauert hat. Deshalb stellen wir Fragen. : P – jaydel

Antwort

1

Grundsätzlich haben Sie nicht die user_id in der Kontakttabelle. Das ist der Fremdschlüssel, mit dem eine Beziehung zu den Benutzern definiert wird. Fügen Sie die Spalte hinzu und fügen Sie beim Erstellen des Kontakts die ID des Benutzers der Spalte user_id in der Kontakttabelle hinzu. Dann sollte das funktionieren.

+0

Fügen Sie die zusätzliche Spalte user_id zu Kontakten mit Fremdschlüssel hinzu. Jetzt werden in der Indexansicht überhaupt keine Kontakte mehr angezeigt, es lädt zwar die Kontakte-URL, zeigt aber keine Kontakte an, nur die Abmelde- oder Hinzufügen-Kontakt-Links. Ich verstehe nicht warum. Hast du eine Idee? (Re-ran migration und und startete Server & db wieder) – blastoff

+1

Es liegt daran, Sie haben user_id column nil für alte Datensätze. –

+0

@Gaurav Gupta Warum wäre es nil, wenn ein neuer Benutzer erstellt wurde (nach allen Änderungen und neu gestartet Server & db) und neue Kontakte unter diesem Benutzer hinzugefügt? Auch nach all dem zeigt der Index nur leer. – blastoff