如何将Controller Favorite Create方法设置为具有索引#view

时间:2016-05-01 13:18:07

标签: ruby-on-rails controller

我想创建一个多态模型,以便在我的用户页面中收藏我想要创建的每个对象。 我正在开发一个学习日语的网络应用程序,我们可以喜欢不同类型的卡片如kanas或kanjis和句子。 所以有3个对象,很快就会被收藏。

我迁移了一个名为Favorite的表:

  create_table "favorites", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "favoritable_id"
    t.string   "favoritable_type"
    t.datetime "created_at",       null: false
    t.datetime "updated_at",       null: false
  end

以下是收藏夹型号belongs_to

class Favorite < ActiveRecord::Base
  belongs_to :favoritable, polymorphic: true
  belongs_to :user
end

以下是卡片型号has_many

class Symbole < ActiveRecord::Base

  accepts_nested_attributes_for :kanji_attribute, :allow_destroy => true
  has_many :sentence_symboles, :class_name => "SentenceSymbole", :foreign_key => "symbole_id"
  has_many :favorites, as: :favoritable     
end

我也加入了句子模型

class Sentence < ActiveRecord::Base
    include Authority::Abilities
    has_many :sentence_symboles, :class_name => "SentenceSymbole", :foreign_key => "sentence_id", dependent: :destroy
    has_many :favorites, as: :favoritable
end

现在这里是Favorite控制器,我真的不知道如何编写create方法。这是我做的控制器:

class FavoritesController < ApplicationController
  def index
     @favorites = Favorite.where(user: current_user)
  end

  def create
    #Favorite.create(user_id: User.last.id, favoritable_id: Symbole.last.id, favoritable_type:"Symbole")
    @favorite = current_user.favoritable.favorites.create(symbole: @symbole, sentence: @sentence).first
    if @favorite.present?
       @favorite.destroy
    else
      @favorite = current_user.favorites.new(symbole: @symbole, sentence: @sentence)
      if not @symbole.favorites.where(user: current_user).take
          @sentence.favorites.where(user: current_user).take
          @favorite.save
      end
    end
    # redirect_to favs_path
    # redirect_to :back
    respond_to do |format|
      format.js { render :ajax_update_favs }
    end
  end

  def destroy
    @favorite = Favorite.find(params[:id])
    @favorite.destroy
    redirect_to :back
  end
end

请有人能给我正确的方式来收藏我想要的所有对象,并添加一个最喜欢的索引#view。

感谢您的帮助。

我认为我的问题很简单,但没有。如何用def创建控制器最喜欢的每个对象是什么?

我这样做

def create
    #Favorite.create(user_id: User.last.id, favoritable_id: Symbole.last.id, favoritable_type:"Symbole")
    @favorite = @favoritable.favorites.build(favorite_params)
    @favorite.user = current_user
    @favorite.save

    respond_to do |format|
      format.js { render :ajax_update_favorites }
    end
  end

1 个答案:

答案 0 :(得分:0)

不确定我完全理解这个问题。您似乎过度复杂favoritesController#create。如果记录只应被优惠一次,则应在Favorite模型中添加uniqueness validation

假设您的user模型设置为

class User < ActiveRecord::Base
  has_many :favorites

  # Rest..
end

def create
  @favorite = current_user.favorites.create(favorite_params)
  # This will create a new Favorite with user_id: current_user.id, favoritable_type: "Symbole", favoritable_id: 1337      
  # Is this the desired behaviour?

  respond_to do |format|
    format.js { render :ajax_update_favs }
  end
end

private

def favorite_params
  params.require(:favorite).permit(:favoritable_type, :favoritable_id)
end

如果从javascript调用jquery,则传递您不喜欢的类型和ID。

  $.post( "/favorites", {
    favorites: { 
      favoritable_type: "Symbole",
      favoritable_id: 1337 
    } 
  });