【发布时间】:2014-11-02 20:40:33
【问题描述】:
我有一个模型“投票”,它通过多态关联属于两个模型,并具有属性 user_id 和 comment_id。以前,我为用户设置了一个投票系统,每次按下按钮时都会为特定用户创建一个新投票:
<%= form_for [@user, @vote] do |f| %>
<input type="hidden" id="user_id" name="user_id" value="#{@user.id}" />
<%= f.submit ": )", :onclick => 'alert("Voted up!")' %>
<% end %>
和@user.votes.count 将返回按钮被按下的次数。但是,我换了一种方法:
查看:
<%= link_to "voteuser", vote_user_path(@user.id), method: :post, :class => "btn btn-small" %>
控制器:
def vote
@user = User.find(params[:id])
Vote.create!(user_id: @user.id)
redirect_to @user
end
路线:
Website::Application.routes.draw do
root 'home_page#home'
get "votes/new"
get 'users/random'
post 'users/vote/:id' => 'users#vote', as: 'vote_user'
get 'users/users/random' => 'users#random'
resources :users
get "all/allusers"
get "all/users/new" => 'users#new'
get 'all/all/allusers' => 'all#allusers'
end
仍然会创建一个投票,其中 user_id 等于当前 User.id,但现在 @user.votes.count 返回 0,因此应用程序没有注册投票属于该用户。我该如何解决这个问题?
投票模型:
class Vote < ActiveRecord::Base
belongs_to :voteable, polymorphic: true
end
投票架构:
create_table "votes", force: true do |t|
t.integer "thing_id"
t.integer "comment_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "voteable_id"
t.string "voteable_type"
end
用户模型:
class User < ActiveRecord::Base
has_many :votes, as: :voteable
end
用户架构:
create_table "users", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.string "avatar_file_name"
t.string "avatar_content_type"
t.integer "avatar_file_size"
t.datetime "avatar_updated_at"
end
【问题讨论】:
-
应该是@user.votes.count
-
@Kimooz 哦,对了,很好。 user.votes.count 在我的代码中是这样的。
-
请确保您的路线行在
users资源之前,如果有的话,在post 'users/:id'之前...如果没有,那么它将尝试发布给用户id:vote... -
我认为您缺少
voteable_type,请显示您的投票架构。 -
请注意,您不需要
comment_id和thing_id。因为如果你只存储对象的投票,它们可以保存在可投票的多态列中。
标签: ruby-on-rails ruby ruby-on-rails-4 associations polymorphic-associations