jQuery / Ajax的新手我如何添加用户关系来创建新的评论?

时间:2011-03-14 00:19:49

标签: ruby-on-rails activerecord jquery

我一直试图掌握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'

感谢您的帮助!

2 个答案:

答案 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