首页 > 解决方案 > 在一对一的关系中,是否可以在删除其他孩子之前检查验证?

问题描述

只是想弄清楚我已经研究了几天的问题。我有一个 has_one/belongs_to 关系,并且路由是嵌套的。通常,如果有 has_many/belongs_to 关系,我可以运行类似:

def new
  @movie = Movie.find(params[:movie_id])
  @review = @movie.reviews.new(review_params)
end

在我的带有嵌套资源的控制器中。

但是,我注意到这不适用于has_one关联,因为我没有review在 @movie 对象上命名的方法。换句话说,我不能通过使用以下方式以相同的方式复制控制器功能:

def new
  @movie = Movie.find(params[:movie_id])
  @review = @movie.review.new(review_params)
end

我已经看到了一些替代方法,例如在此页面上使用@movie.build_review或: https://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one,但我遇到了问题,因为它会在调用时立即删除关联的对象,不检查验证。好奇是否有人对可能的解决方案有任何建议。我现在已经花了很长时间寻找解决方案,而且我尝试过的许多事情还没有产生任何实质性的结果。感谢您的任何建议!@movie.create_review

标签: ruby-on-railsdestroyhas-one

解决方案


创建新评论应该发生在create方法中,而不是new. 您可以分两步完成:

def create  @movie = Movie.find(params[:movie_id])
  @review = Review.new(review_params)
  @review.movie = @movie
  if @review.save
    redirect_to movie_path(@movie) # or somewhere else
  else
    render :new
  end
end

推荐阅读