【问题标题】:'Like/Unlike' button with Rails 4Rails 4 的“喜欢/不喜欢”按钮
【发布时间】:2014-09-21 01:14:53
【问题描述】:

我正在尝试使用 Rails 4 创建一个简单的 Like/unlike 按钮。我尝试使用社交 gem 来做到这一点,但经过一天的努力,我放弃并决定从 Rails 修改 M. Hartl 的“follow”机制教程。这是我到目前为止得到的:

用户.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

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

点赞.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 %>

routes.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 文件(“create”和“destroy”)。

“喜欢/不喜欢”机制本身似乎运作良好 - 在控制台中,我的“喜欢!”和“不像!”方法,我可以创建和销毁带有 id、liker_id 和 like_id 的“Like”对象。

问题从按钮本身开始。

我可以看到“赞!”每个答案旁边的按钮,但是当我单击它时-出现此错误:

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!"}

【问题讨论】:

  • 它应该显示传递给调用的参数列表。你能证明吗?
  • 啊,是的,我忘记了。问题已编辑。

标签: ruby-on-rails ruby-on-rails-4 social-media-like


【解决方案1】:

您使用了错误的隐藏字段标签。 http://api.rubyonrails.org/v4.1.1/classes/ActionView/Helpers/FormHelper.html#method-i-hidden_field 表明您需要在标签中提供两个值。将您喜欢的 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 %>

这应该会得到你想要的。

【讨论】:

  • 好的,我更进一步 - 非常感谢。但现在我得到:
    中的 [undefined method `merge' for nil:NilClass]。 (参数:“id”=>“1”)当我尝试使用按钮查看页面时。
  • stackoverflow.com/questions/9279313/… 提供了原因。显然它正在寻找一个符号,所以你必须提供一个而不仅仅是一个值。
  • 是的,我已经尝试过使用 ':value',但这让我回到了第一个错误(“找不到带有 'id'=" 的答案等)。我还注意到,当我单击“Like”时,rails 会尝试将我重定向到 localhost:3000/likes。这是应该发生的事情吗?
  • 恐怕我不知道。我不喜欢在视图中构建对象(尤其是在表单中),但是如果不深入研究它,我看不出它有什么问题,但这可能是问题所在。如果可能的话,我建议将您的 current_user.likes.build... 从您的视图中拉出并进入您的控制器。
  • 第 2 天更新所有可能阅读此内容的人。我注意到答案嵌套在问题中,所以我想这就是Answer.find(params[:like][:liked_id] 给出“nil”的原因。在我的 LikesController#create 中,我输入了 @question = Question.find(params[:id]),然后是 @answer = @question.answers.find(params[:like][:liked_id]。可悲的是,这几乎没有任何区别。现在我收到类似的错误,但有问题:Couldn't find Question without an ID。我仍在尝试修改 @question 参数或路由,但目前 - 没有成功。
猜你喜欢
  • 2012-09-20
  • 2016-04-04
  • 2019-07-03
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多