如何使用ruby on rails创建多态关联的控制器



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

(假设postPost的实例)

多态关系背后的思想是具有多个模型的多对多关系,因此您应该通过源模型创建任何"可投票"记录,在本例中为Post

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

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

post.votes.count += 1

相关内容

  • 没有找到相关文章

最新更新