Kojarzenie dwóch modeli w szynach (użytkownik i profil)
Jestem nowym użytkownikiem Rails. Buduję aplikację, która ma model użytkownika i model profilu.
Chcę powiązać te modele w taki sposób, że:
- Po utworzeniu konta użytkownik jest automatycznie wysyłany na stronę „Utwórz profil”, a utworzony przez niego profil jest podłączony tylko do tego konkretnego użytkownika.
- Tylko użytkownik, który jest właścicielem profilu, może go edytować.
Wygenerowałem model użytkownika za pomocą nifty_generators. Gdy trafienia użytkownika przesyłają do utworzenia konta, przekierowuję go do widoku „nowy profil”, aby utworzyć profil. Zrobiłem to, edytując ścieżkę przekierowania w kontrolerze użytkownika. Kontroler użytkownika wygląda tak:
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = @user.id
flash[:notice] = "Thank you for signing up! You are now logged in."
redirect_to new_profile_path
else
render :action => 'new'
end
end
To działało, ale problem polegał na tym, że aplikacja nie rozpoznała, że profil jest połączony z tym konkretnym użytkownikiem. Udało mi się utworzyć profile, ale nie było związku między profilem a użytkownikiem.
Mój model profilu zawiera listę: belongs_to: user
Lista modeli użytkownika: ma _one: profil
Plik Moje trasy.rb zawiera następujące informacje:
map.resources: users,: has_one =>: profile
map.resources: profile
Mam klucz obcy user_id w tabeli profili. Mój schemat wygląda tak:
create_table "profiles", :force => true do |t|
t.integer "user_id"
t.string "name"
t.string "address1"
t.string "address2"
t.string "city"
t.string "state"
t.string "zip"
t.string "phone"
t.string "email"
t.string "website"
t.text "description"
t.string "category"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", :force => true do |t|
t.string "username"
t.string "email"
t.string "password_hash"
t.string "password_salt"
t.datetime "created_at"
t.datetime "updated_at"
end
Aby spróbować połączyć profil z użytkownikiem, zaktualizowałem plik profiles_controller.rb o następujący, który w zasadzie ekstrapolowałem z podręcznika Rails Getting Started Guide. Myślę, że w mojej aplikacji profile łączą się z użytkownikami w taki sam sposób, jak w aplikacji Rails Getting Started, komentarze łączą się z postami. Oto odpowiednie części mojego kontrolera profili. Mogę przekazać całość, jeśli to pomoże:
def new
@user = User.find(params[:user_id])
@profile = @user.profile.build
end
def create
@user = User.find(params[:user_id])
@profile = @user.profile.build(params[:profile])
if @profile.save
flash[:notice] = 'Profile was successfully created.'
redirect_to(@profile)
else
flash[:notice] = 'Error. Something went wrong.'
render :action => "new"
end
koniec
Po wprowadzeniu tych aktualizacji do kontrolera profili, teraz po przesłaniu na ekranie tworzenia konta, jestem przekierowywany na stronę błędu, która mówi:
ActiveRecord :: RecordNotFound w ProfilesController # new
Nie można znaleźć użytkownika bez identyfikatora
To wszystko wydaje się być dość prostym przypadkiem użycia Railsów, ale nie jestem pewien, które elementy są błędne. Z góry dziękuje za twoją pomoc!