我已经使用这个迁移创建了一个feed_item
class CreateFeeds < ActiveRecord::Migration
def change
create_table :feeds do |t|
t.integer :item_id
t.string :item_type
t.integer :user_id
t.timestamps
end
end
end
class Feed < ActiveRecord::Base
belongs_to :user
belongs_to :item, polymorphic: true
end
我正在像一样显示提要的内容
照片=image_tag feed.item.image_url
岗位=feed.item.text
我试图添加一个投票按钮,这样投票模型的迁移看起来像
class CreateVotes < ActiveRecord::Migration
def change
create_table :votes do |t|
t.integer :votable_id
t.string :votable_type
t.timestamps
end
end
end
class Vote < ActiveRecord::Base
belongs_to :votable, polymorphic: true
end
class Post < ActiveRecord::Base
belongs_to :user
has_many :votes, as: :votable
end
如何创建投票控制器的创建操作?
我试过
class VotesController < ApplicationController
def create
@votable = find_votable
@vote = @votable.votes.build(params[:vote])
end
private
def find_votable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
def vote_params
params.require(:vote).permit(:votable)
end
end
并得到了未定义的方法"投票"
也尝试过
@vote = params[:votable_type].classify.constantize.find(params[:votable_type])
我得到了未定义的方法"分类"
你不会使用VotesController,你会通过与它们有多态关系的其他模型来创建投票。在上面的示例中,您可以通过以下方式创建它们:
post.votes
(假设post
是Post
的实例)
多态关系背后的思想是具有多个模型的多对多关系,因此您应该通过源模型创建任何"可投票"记录,在本例中为Post
。
例如,您可以在您的PostController
中创建一个vote
方法,该方法将创建如上所述的投票关联,然后添加适当的路线来提交您的投票表。
此外,您的Vote
模型还可以包含其他数据,具体取决于您希望如何使用投票。例如,如果您想跟踪模型获得的票数,可以添加count
列。在这种情况下,您将创建记录为:
post.votes.count += 1