0

Rails 4 で単純な Like/Unlike ボタンを作成しようとしています。socialization gem でこれをやろうとしましたが、1 日苦労した後、あきらめて、Rails チュートリアルの M. Hartl の「愚かな」メカニズムを変更することにしました。これが私がこれまでに得たものです:

ユーザー.rb

class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :validatable

has_many :questions
has_many :answers
has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_answers, through: :likes, source: :liked, source_type: "Answer"

def like?(answer)
 likes.find_by(liked_id: answer.id)
end

def like!(answer)
 likes.create!(liked_id: answer.id)
end

def unlike!(answer)
 likes.find_by(liked_id: answer.id).destroy
end
end

Answer.rb:

class Answer < ActiveRecord::Base
belongs_to :question
belongs_to :user

has_many :likes, foreign_key: "liked_id",
                 class_name:  "Like",
                 dependent:   :destroy
has_many :likers, through: :likes, source: :liker
end

Like.rb:

class Like < ActiveRecord::Base
belongs_to :liker, class_name: "User"
belongs_to :liked, class_name: "Answer"
validates :liker_id, presence: true
validates :liked_id, presence: true
end

likes_controller.rb:

class LikesController < ApplicationController
skip_before_action :verify_authenticity_token
before_action :authenticate_user!

respond_to :html, :js

def create
  @answer = Answer.find(params[:like][:liked_id])
  current_user.like!(@answer)
  respond_with @answer.question
end

def destroy
  @answer = Like.find(params[:id]).liked
  current_user.unlike!(@answer)
  respond_with @answer.question
end
end

_like.html.erb:

<%= form_for(current_user.likes.build(liked_id: @answer.id), remote: true) do |f| %>
<div><%= f.hidden_field :liked_id %></div>
<%= f.submit "Like!", class: "btn btn-large btn-primary" %>
<% end %>

_unlike.html.erb:

<%= form_for(current_user.likes.find_by(liked_id: @answer.id),
         html: { method: :delete }, remote: true) do |f| %>
<%= f.submit "Unlike.", class: "btn btn-large" %>
<% end %>

ルート.rb:

Rails.application.routes.draw do
devise_for :users
scope "/admin" do
  resources :users
end
resources :questions do
resources :answers do
    get :likes
  end
end
resources :likes, only: [:create, :destroy]
root to: 'questions#index'
end

また、application.js に必要な jQuery と jQuery_ujs と、ビューに関連する js.erb ファイル (「作成」と「破棄」) があります。

'like/unlike' メカニズム自体はかなりうまく機能しているようです。と「違う!」メソッドを使用すると、id、liker_id、liked_id を使用して「いいね」オブジェクトを作成および破棄できます。

問題はボタン自体から始まります。

「いいね!」が見えます。各回答の横にあるボタンですが、クリックすると次のエラーが発生します。

ActiveRecord::RecordNotFound in LikesController#create
Couldn't find Answer with 'id'=

LikesController の次の行にエラー ポイントがあります。

@answer = Answer.find(params[:like][:liked_id])

@answer.id の結果は「nil」になると思いますが、どこで間違いを犯したのかわかりません。私の最初の推測はルートファイルでしょう-すべてが正しいかどうかはまだわかりません。

私は一日中解決策を探していました.SOについても同様の質問をいくつか見つけましたが、どの回答も役に立ちませんでした.

どんなアイデアでも大歓迎です。

編集: エラーからのパラメーター

Parameters:

{"utf8"=>"✓",
"like"=>{"liked_id"=>""},
"commit"=>"Like!"}
4

1 に答える 1

0

hidden フィールド タグの使い方が間違っています。http://api.rubyonrails.org/v4.1.1/classes/ActionView/Helpers/FormHelper.html#method-i-hidden_​​fieldは、タグに 2 つの値を指定する必要があることを示しています。like ERB ファイルを次のように変更します。

_like.html.erb:

<%= form_for(current_user.likes.build(liked_id: @answer.id), remote: true) do |f| %>
  <div><%= f.hidden_field :liked_id, :value => @answer.id %></div>
  <%= f.submit "Like!", class: "btn btn-large btn-primary" %>
<% end %>

そしてそれはあなたが望むものをあなたに与えるはずです。

于 2014-07-29T15:47:50.503 に答える