gpt4 book ai didi

ruby-on-rails - Ruby on Rails - 关联、模型和收藏夹

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:09 27 4
gpt4 key购买 nike

我正在创建一个涉及我的爱好之一的应用程序,电影。我希望我的用户能够选择他们喜欢的电影。从我的项目运行代码时,我收到以下错误消息。

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

我通过阅读 Rails 教程第 11 章创建了这些关联,但我不确定它是否适用于收藏夹,而且我可能犯了一些错误。

这是我的重要迁移(电影、用户、收藏夹)

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

我在我的用户 Controller 中定义了一个收藏夹方法,但其中没有任何内容。这是我的 Controller

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

我认为问题可能出在我对 ID 的使用上。我有两个用于用户和电影的 ID(user_id、id、movie_id、id)。

我阅读了各种文档、Stack Overflow 和 Rails 教程中的一些类似问题来编写我的代码,但我真的很困惑。我不确定我做错了什么,我想更好地理解关联。

非常感谢任何帮助。

最佳答案

如果您要使用 has_many :through ,您需要在连接模型的 belongs_to 关系中包含这两个模型:

#app/models/favorite.rb
Class Favorite < ActiveRecord::Base
belongs_to :user
belongs_to :movie
end

enter image description here

您可能还希望将对 :favorite_movies 的引用更改为仅 :movies:

#app/models/user.rb
Class User < ActiveRecord::Base
has_many :favorites
has_many :movies, through: :favorites
end

#app/models/movie.rb
Class Movie < ActiveRecord::Base
has_many :favorites
has_many :users, through: :favorites
end

我没有读过您一直在使用的教程,所以我无法评论您当前的设置;但是,我建议的是最基本的“Rails”方法。

希望这对您有帮助!

关于ruby-on-rails - Ruby on Rails - 关联、模型和收藏夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358324/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com