2

嗨,我想知道用户是否有办法更新他们已经写过的评论,我尝试使用 cancan 但遇到了一些问题,所以我想看看是否有更简单的方法。这是评论控制器中“新”方法的代码

def new
  if logged_in?
    @review = Review.new(:film_id => params[:id], :name =>
      User.find(session[:user_id]).name)

    session[:return_to] = nil
  else 
    session[:return_to] = request.url
    redirect_to login_path, alert: "You must be logged in to write a review"
  end
end

和“创建”方法

def create
  # use the class method 'new' with the parameter 'review', populated 
  # with values from a form 
  @review = Review.new(params[:review])
  # attempt to save to the database, the new review instance variable 
  if @review.save
    # use the class method 'find' with the id of the product of the 
    # saved review and assign this product object to the variable 'product'
    film = Film.find(@review.film.id)
    # redirect the reviewer to the show page of the product they reviewed,
    # using the product variable, and send a notice indicating the review 
    # was successfully added
    redirect_to film, notice: "Your review was successfully added"
  else
    # if the review could not be saved, return / render the new form
    render action: "new"
  end
end

如果他们已经为产品写过评论,我希望用户编辑他们的评论。而不是来自同一用户对同一产品的两次评论。

4

3 回答 3

0

要更新记录,您应该使用update用户提交edit表单后请求的操作。

于 2013-02-21T13:24:14.033 回答
0

让你的用户模型有 has_many/has_one :reviews。并查看模型 belongs_to :user。然后,如果您有任何类型的授权(并且您应该拥有,例如:设计),您就会知道审阅用户当前是否是登录用户。如果是,则渲染编辑按钮,否则不渲染。

同样根据 CRUD 约定,您需要 2 个操作。首先它edit和另一个update。您可以在 railsguides.com 上了解它

于 2013-02-21T13:28:42.983 回答
0

您可能会将这样的内容放入该create方法中:

# Assumes that your user names are unique
@review = Review.find_or_create_by_film_id_and_name(params[:review][:film_id], User.find(session[:user_id]).name)
@review.update_attributes(params[:review])

这将执行以下操作

  1. 检查用户是否为电影创建了评论
  2. 如果是,则将现有评论分配给@review实例变量
  3. 如果不是,则创建一个新Review对象并将其分配给@review
  4. 更新@review_params[:review]

或者,以下语句将在不使用 Railsfind_or_create便捷方法的情况下完成相同的操作:

user_name = User.find(session[:user_id]).name # To avoid two DB lookups below
@review = Review.find_by_film_id_and_name(params[:review][:film_id],  user_name) || Review.new(:film_id => params[:review][:film_id], :name => user_name)
@review.update_attributes(params[:review])
于 2013-02-21T18:36:34.367 回答