1

我使用此迁移创建了一个 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

post = 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])

我得到未定义的方法“分类”

4

1 回答 1

2

您不会使用 VotesController,而是通过与它们具有多态关系的其他模型创建投票。在上面的示例中,您将通过以下方式创建它们:

post.votes

(假设post是 的一个实例Post

多态关系背后的想法是与多个模型的多对多关系,因此您应该通过源模型创建任何“可投票”记录,在本例中,Post.

例如,您可以vote在您的方法中创建一个方法,PostController如我在上面概述的那样创建投票关联,然后添加适当的路线来提交您的投票表格。

此外,您的Vote模型还可能包含其他数据,具体取决于您希望如何使用投票。例如,如果您想跟踪模型获得的投票数,您可以添加一count列。在这种情况下,您将创建记录为:

post.votes.count += 1
于 2013-12-16T23:22:54.327 回答