我还在轨道上学习红宝石中的绳索,这个问题可能很简单,但它现在有点困扰我了 环境:在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
端
答案 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 %>
希望,它会对你有用:)