我在Rails 4中的协会不起作用。
review.rb
class Review < ActiveRecord::Base
belongs_to :movie, :class_name => "Movie", :foreign_key => "movie_id"
belongs_to :moviegoer
# review is valid only if it's associated with a movie:
validates :movie_id, :presence => true
# can ALSO require that the referenced movie itself be valid
# in order for the review to be valid:
validates_associated :movie
endmovie.rb
class Movie < ActiveRecord::Base
has_many :reviews
before_save :capitalize_title
def capitalize_title
self.title = self.title.split(/\s+/).map(&:downcase).
map(&:capitalize).join(' ')
end
scope :with_good_reviews, lambda { |threshold|
Movie.joins(:reviews).group(:movie_id).
having(['AVG(reviews.potatoes) > ?', threshold.to_i])
}
scope :for_kids, lambda {
Movie.where('rating in (?)', %w(G PG))
}
scope :recently_reviewed, lambda { |n|
Movie.joins(:reviews).where(['reviews.created_at >= ?', n.days.ago]).uniq
}
def self.all_ratings ; %w[G PG PG-13 R NC-17] ; end # shortcut: array of strings
validates :title, :presence => true
validates :release_date, :presence => true
validate :released_1930_or_later # uses custom validator below
validates :rating, :inclusion => {:in => Movie.all_ratings},
:unless => :grandfathered?
def released_1930_or_later
errors.add(:release_date, 'must be 1930 or later') if
release_date && release_date < Date.parse('1 Jan 1930')
end
@@grandfathered_date = Date.parse('1 Nov 1968')
def grandfathered?
release_date && release_date < @@grandfathered_date
end
endreviews_controller.rb
class ReviewsController < ApplicationController
before_filter :has_moviegoer_and_movie, :only => [:index, :new, :create]
protected
def has_moviegoer_and_movie
unless @current_user
flash[:warning] = 'You must be logged in to create a review.'
redirect_to '/auth/twitter'
end
unless (@movie = Movie.where(:id => params[:movie_id]))
flash[:warning] = 'Review must be for an existing movie.'
redirect_to movies_path
end
end
public
def index
@reviews = @movie.reviews
render(:partial => 'review', :object => @reviews) if request.xhr?
end
def new
@review = @movie.reviews.build
end
def create
# since moviegoer_id is a protected attribute that won't get
# assigned by the mass-assignment from params[:review], we set it
# by using the << method on the association. We could also
# set it manually with review.moviegoer = @current_user.
@current_user.reviews << @movie.reviews.build(params[:review])
redirect_to movie_path(@movie)
end
end在评审控制器中,当我试图访问@movie.reviews时,它应该返回属于该电影的所有评论的列表,但是相反,我得到一个错误,该错误显示“未定义的方法‘评论’用于电影‘”错误。这里发生了什么事?这应该管用对吧?我还建立了一个嵌套的路由。
resources :movies do
resources :reviews
end发布于 2017-04-21 00:01:22
这句话:
unless (@movie = Movie.where(:id => params[:movie_id]))获取ActiveRecord_Relation而不是记录实例。你应该这样做:
unless (@movie = Movie.find(params[:movie_id]))相反,
https://stackoverflow.com/questions/43531517
复制相似问题