2

こんにちは私は、ユーザーがすでに書いたレビューを更新できる方法があるかどうか疑問に思っていました。cancanを使用してみましたが、いくつかの問題が発生したため、もっと簡単な方法があるかどうかを調べます。これは、レビューコントローラーの「new」メソッドからのコードです

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

および「create」メソッド

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

すでに商品のレビューを書いている場合は、ユーザーにレビューを編集してもらいたい。同じ商品について同じユーザーから2件のレビューをもらう代わりに。

4

3 に答える 3

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]

または、次のステートメントは、Railsのfind_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 に答える
0

レコードを更新するには、ユーザーがフォームをupdate送信した後に要求されるアクションを使用する必要があります。edit

于 2013-02-21T13:24:14.033 に答える
0

ユーザーモデルにhas_many/has_one:reviewsを持たせます。そして、レビューモデルbelongs_to:user。そして、あなたが何らかの種類の承認を持っている場合(そしてあなたが持っているべきです、例えば:devise)、あなたはレビューのユーザーが現在ログに記録されたユーザーであるかどうかを知るでしょう。その場合は編集ボタンをレンダリングし、そうでない場合はレンダリングしません。

また、CRUDの規則に従って、必要なアクションは2つあります。最初にそれとedit他のものupdate。あなたはrailsguides.comでそれについて読むことができます

于 2013-02-21T13:28:42.983 に答える