【问题标题】:Rails 4: Model Associations are not workingRails 4:模型关联不起作用
【发布时间】:2017-04-20 23:28:00
【问题描述】:

我在 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

end

电影.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
end

reviews_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

【问题讨论】:

  • 哪一行给你错误?这个@current_user.reviews &lt;&lt; @movie.reviews.build(params[:review]) ?
  • @review = @movie.reviews.build@reviews = @movie.reviews 是给我错误的那个,具体取决于我尝试运行的操作

标签: ruby ruby-on-rails-4 associations


【解决方案1】:

行:

unless (@movie = Movie.where(:id => params[:movie_id]))

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

unless (@movie = Movie.find(params[:movie_id]))

改为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多