我一直试图掌握jQuery,并且在添加Ajax添加审核表单时遵循了railscast,这样可以正常工作但我现在想要添加一个审核属性的功能用户以及场地。
评论控制器
def create
@review = Review.create!(params[:review])
@review.venue = @venue
if @review.save
flash[:notice] = 'Thank you for reviewing this venue!'
respond_to do |format|
format.html { redirect_to venue_path(@venue) }
format.js
end
else
render :action => :new
end
end
的观点\评论\ create.js.erb
$("#new_review").before('<div id="flash_notice"><%= escape_javascript(flash.delete(:notice)) %></div>');
$("#reviews_count").html("<%= pluralize(@review.venue.reviews.count, 'Review') %>");
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");
$("#new_review")[0].reset();
我尝试将控制器更改为:
def create
@review = @current_user.reviews.create!(params[:review])
@review.venue = @venue
if @review.save
flash[:notice] = 'Thank you for reviewing this venue!'
respond_to do |format|
format.html { redirect_to venue_path(@venue) }
format.js
end
else
render :action => :new
end
end
但它不会提交,没有错误。
我认为我已经使用belongs_to和has_many正确设置了模型,我认为这是一个控制器问题,如果需要,我会添加其他代码位。
开发日志
NoMethodError (undefined method `reviews' for nil:NilClass):
app/controllers/reviews_controller.rb:14:in `create'
感谢您的帮助!
答案 0 :(得分:2)
您的错误似乎与@current_user
一起存在。根据您的开发日志,当您致电@current_user
时,nil
为@current_user.reviews
。我会说跟踪这个@current_user
实例变量的设置位置并找出它为nil
的原因。现在,您使用什么样的身份验证?大多数身份验证插件,尤其是您提到的Railscasts的Ryan Bates使用的插件,都使用局部变量(例如current_user
)作为访问当前登录用户的方法。我知道我在所有代码中都这样做。
因此,将该行重写为
@review = current_user.reviews.create!(params[:review])
看看是否有效。如果没有,请将其更改回来,然后追踪设置此@current_user
的位置。机会很好,它在控制器开头的before_filter :method_name
设置。
答案 1 :(得分:0)
致电创造! (带有感叹号)将抛出异常,因此如果保存失败则中止您的创建操作。检查log / development.log以了解这些异常。
使用build而不是create并丢失感叹号。
def create
@review = @current_user.reviews.build(params[:review])
@review.venue = @venue
if @review.save
flash[:notice] = 'Thank you for reviewing this venue!'
respond_to do |format|
format.html { redirect_to venue_path(@venue) }
format.js
end
else
render :action => :new
end
end