首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4:模型关联不起作用

Rails 4:模型关联不起作用
EN

Stack Overflow用户
提问于 2017-04-20 23:28:00
回答 1查看 60关注 0票数 1

我在Rails 4中的协会不起作用。

review.rb

代码语言:javascript
复制
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

end

movie.rb

代码语言:javascript
复制
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
end

reviews_controller.rb

代码语言:javascript
复制
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时,它应该返回属于该电影的所有评论的列表,但是相反,我得到一个错误,该错误显示“未定义的方法‘评论’用于电影‘”错误。这里发生了什么事?这应该管用对吧?我还建立了一个嵌套的路由。

代码语言:javascript
复制
resources :movies do
  resources :reviews
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-21 00:01:22

这句话:

代码语言:javascript
复制
unless (@movie = Movie.where(:id => params[:movie_id]))

获取ActiveRecord_Relation而不是记录实例。你应该这样做:

代码语言:javascript
复制
unless (@movie = Movie.find(params[:movie_id]))

相反,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43531517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档