1

私は現在、thumbs_up を使用して好き嫌いのレール アプリを実装しようとしています。このページの指示に従いました: Rails 3 で "thumbs_up" 投票ジェムを使用する方法の説明

ユーザーは、本に「いいね!」または「いいね!」を付けることができます。私は 2 つのボタンがあり、好きなボタンとそうでないボタンがあり、ユーザーの現在の好きなステータスに応じて、どちらか一方をユーザーから隠したいと考えています。したがって、if else は次のように適切であると考えました。

<% if @user.voted_on?(@book) %>    
  <div class="unlike_button"><%= link_to("Unlike", unvote_book_path(book), method: :post) %></div>
<% else %>
  <div class="like_button"><%= link_to("Like", vote_up_book_path(book), method: :post) %></div>
<% end %>

そして私のroute.rbファイルで:

resources :books do
  member do
    post :vote_up
    post :unvote
  end
end

しかし、これを実行すると、次のエラー メッセージが表示されます。

未定義のメソッド `voted_on?' nil:NilClass の場合

私が間違っているかもしれないことはありますか?

アップデート

Mischa が提案したように、current_user.voted_on に変更しました。今、私はこのエラーメッセージを受け取ります:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

以下は私の Books コントローラーのスニペットです

include UsersHelper
include SessionsHelper


  before_filter :signed_in_user, only: [:index]
  before_filter :admin_user, only: :destroy

  def index
    array = Book.search(params[:search])
    @books = Kaminari.paginate_array(array).page(params[:page]).per(5)

  end

   def show
    @book = Book.find(params[:id])
    #respond_to do |format|
    #format.js
  #end
  end


  def destroy
    Book.find(params[:id]).destroy
    flash[:success] = "Book deleted."
    redirect_to books_url
  end

  def vote_up
    begin
      current_user.vote_for(@book = Book.find(params[:id]))
      flash[:success] = "Liked!."
      redirect_to books_url
    end
  end

  def unvote
    begin
      current_user.unvote_for(@book = Book.find(params[:id]))
      flash[:success] = "Unliked!."
      redirect_to books_url
    end
  end
4

1 に答える 1

-1

リンクの方法をpostからputに変更し、routes.rb

resources :books

次のコードを使用して、リンクを使用してデータを更新することもできます。

 <%= link_to "Like", book, :method => :put %>
or 
 <%= link_to "Unlike", book, :method => :put %>

これは、Post モデルに is_liked ブール値フィールドがあると仮定して、コントローラーに当てはまります。

def update
@post = Post.find(params[:id])

   if @post.is_liked?
      @post.attributes = {
      :is_liked => "f"
    }
    redirect_to posts_path, :flash => "Unliked"
   else
     @post.attributes = {
      :is_liked => "t"
        }
     redirect_to posts_path, :flash => "Liked"
   end

end
于 2013-05-09T03:51:49.740 に答える