两个模型的Rails 3验证错误

时间:2013-06-25 12:22:46

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2

我还在轨道上学习红宝石中的绳索,这个问题可能很简单,但它现在有点困扰我了 环境:在ubuntu上使用rails 3.2,ruby 1.9 我正在构建一个小评论应用程序,以便在rails.e上学习ruby 我有一个网页评论/ new.erb,我保存了新评论。它将在顶部显示电影名称。

reviews / new.erb看起来像这样

<h3><%= @movie.name %></h3>
<%= form_for @review do |f| %>
<%= render "shared/error_messages", :target => @review %>
<%= f.hidden_field :movie_id %>
<%= f.label :rating, "Rate the movie" %>
<%= f.select :rating,['1','2','3','4'] %>
<%= f.label :review, "Your 140 character review" %>
<%= f.text_area :review %>
<%= f.submit "Fire", :disable_with => 'Submitting...' %>
<% end %>

我的new和create的控制器方法是

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

def create
 @user=current_user
 @review=Review.create params[:review]
 @review.user_id=@user.id
 @review.movie_id=params[:movie_id]
 @movie=Movie.find(params[:movie_id])
 if @review.save
   flash[:notice] = 'Movie was successfully created.'
   redirect_to :controller => "movies",:action => "show",:id => @review.movie_id
 else
   redirect_to :action => "new", :movie => @movie
 end  
end

当我尝试在new.erb中显示验证错误消息时,我收到此错误

Couldn't find Movie without an ID

Rails.root: /home/Development/ohmyroots
Application Trace | Framework Trace | Full Trace

app/controllers/reviews_controller.rb:14:in `create'

我添加没有混合内容的电影的其他形式工作正常。 关于解决这个问题的建议值得赞赏。谢谢。

我正在使用动态表单gem来显示视图中的验证

更新:我的新创建方法

def create
@review=Review.create(params[:review])
@user=current_user
@review.user_id=@user.id
@review.movie_id=params[:movie_id]
@review.rating=params[:rating]
@review.review=params[:review]
if @review.save
  flash[:notice] = 'Movie was successfully created.'
  redirect_to :controller => "movies",:action => "show",:id => @review.movie_id
else
  @movie=Movie.find(params[:movie_id])
  render :action => "new",:movie => @movie
end  

2 个答案:

答案 0 :(得分:1)

评论/ new.erb目前是一个未将电影的ID传递给创建操作的表单。这就是为什么你会收到一个错误,它找不到没有ID的电影。

尝试对隐藏字段标记进行此更改:

<%= f.hidden_field :movie_id, :value => @movie.id %>

答案 1 :(得分:0)

您已为Review对象添加了表单,但在初始化对象时,该对象的所有属性都为空白,因此为movie_id。所以你得到这个错误,所以要修复它,我们可以在创建时初始化对象。只需将以下代码添加到控制器的新操作中即可。

def new
    @movie=Movie.find_by_id(params[:movie])
    @review=Review.new({:movie_id => @movie.id})
end

在视图页面中,

<%= f.hidden_field :movie_id %>

希望,它会对你有用:)