Я создаю приложение, связанное с одной из моих страстей, кино. Я хотел бы, чтобы мои пользователи могли выбирать свои любимые фильмы. При запуске кода из моего проекта я получил следующее сообщение об ошибке.
Undefined Method: 'favorites' for nil:NilClass
<h1>My Favorites</h1>
<%= @favorites = @user.favorites.to_a %>
<table class = "favorites-table">
<thead>
Я тестировал функциональность избранного, работая в консоли, поэтому поэкспериментировал с приведенным выше кодом в файле Favorites.html.erb.
Единственная проблема в том, что я настроил ассоциации и доказал, что могу получить доступ к этому методу через консоль rails.
u = User.first
u.favorites => nil
u.favorites.to_a << Movie.first
Это работало в ActiveRecord, но не на сервере rails.
Вот мои ассоциации (Фильм, Пользователь и Избранное)
class Movie < ActiveRecord::Base
belongs_to :user
has_many :favorite_movies
has_many :favorited_by, through: :favorite_movies, source: :user
end
class User < ActiveRecord::Base
has_many :favorites, foreign_key: "user_id", dependent: :destroy
has_many :favorite_movies, through: :favorites, source: :movies
end
class Favorite < ActiveRecord::Base
belongs_to :user
validates :movie_id, presence: true
validates :user_id, presence: true
end
Я создал эти ассоциации, прочитав главу 11 Учебника по Rails, но я не уверен, что это работает для избранных, и, возможно, я сделал пару ошибок.
Вот мои важные миграции (Фильмы, Пользователи, Избранное)
class CreateMovies < ActiveRecord::Migration
def change
create_table :movies do |t|
t.string :title
t.string :director
t.string :genre
t.integer :movie_id # Potential land-mine
t.integer :release_date
t.integer :reviewed
t.integer :stars
t.timestamps
end
end
end
Мой файл миграции пользователей
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.integer :user_id # Potential land-mine. Users already have separate ID column (primary key)
t.string :name
t.string :password
t.string :email
t.timestamps
end
end
end
class CreateFavorites < ActiveRecord::Migration
def change
create_table :favorites do |t|
t.integer :user_id
t.integer :movie_id
t.timestamps
end
add_index :favorites, :user_id
add_index :favorites, :movie_id
add_index :favorites, [:user_id, :movie_id], unique: true
end
end
Вот мои маршруты
resources :movies do
put :favorite, on: :member
end
resources :users
У меня есть метод Favorites, определенный в моем контроллере Users, но внутри него ничего нет. Вот мой контроллер
class UsersController < ApplicationController
before_action :signed_in_user, only: [:edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
flash[:success] = "Congratulations #{@user.name}! You have successfully created an account"
redirect_to @user
else
render 'new'
end
end
def update
end
def destroy
end
def favorites
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation) # Potential Land-mine
end
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url notice: "Please sign in."
end
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
end
Я думаю, что проблема может заключаться в том, что я использую идентификаторы. У меня есть два идентификатора для пользователей и фильмов (user_id, id, movie_id, id).
Я читал различную документацию, некоторые похожие вопросы о переполнении стека и учебник по Rails, чтобы придумать свой код, но я действительно запутался. Я не уверен, что я делаю неправильно, и я хотел бы лучше понять ассоциации.
Любая помощь приветствуется.
Favorite
. Эта строкаbelongs_to :user_id, class_name: "User"
неверна. Она должна быть простоbelongs_to :user
- person Pavan   schedule 23.06.2014@user
ноль. - person Pavan   schedule 23.06.2014