0

我仍在学习 ruby​​ on rails 中的绳索,这个问题可能很简单,但它现在困扰了我一段时间 环境:rails 3.2,ubuntu 上的 ruby​​ 1.9 我正在构建一个小型评论应用程序来学习 rails 上的 ruby​​.e 我有一个网页评论/new.erb 我保存新评论的地方。它将在顶部显示电影名称。

评论/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  

结尾

4

2 回答 2

1

Reviews/new.erb 目前是一种不会将电影 ID 传递给 create 操作的表单。这就是为什么您会收到一个错误,即它无法找到没有 ID 的电影。

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

<%= f.hidden_field :movie_id, :value => @movie.id %>
于 2013-06-25T12:35:57.443 回答
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 %>

希望,它会为你工作:)

于 2013-06-25T14:06:53.500 回答