0

ユーザーが表示できる事前定義された飲み物のリストがあるアプリがあります。ユーザーが飲み物をお気に入り/お気に入りから外す機能を提供しようとしています。

お気に入りのリンクをクリックすると、何らかの理由で AssociationMismatch エラーが発生します。どうやら、コードは私の current_user.favorite_drinks << @drink コードの部分が好きではありません

コントローラーDrinks_controller.rb

def favorite
  type = params[:type]
  if type == "favorite"
    @drink = Drink.find params[:drink_id]
    current_user.drinks << @drink
      redirect_to :back, notice: 'You favorites #{@drink.name}'
    elsif type == "unfavorite"
      current_user.drinks.delete(@drink)
      redirect_to :back, notice: 'You unfavorited #{@drink.name}'
    else
    redirect_to :back, notice: 'Nothing happened'
  end
end

コントローラのお気に入り_controller.rb

def show
  @user = User.find(params[:id])
  if @user
    @drinks = @user.favorite_drinks.all
    render action: :show
  else
    render file: 'public/404', status: 404, formats: [:html]
  end
end

ルート routes.rb

'auth/:provider/callback' に一致、宛先: 'sessions#create' 一致 'auth/failure'、宛先: redirect('/') 一致 'signout'、宛先: 'sessions#destroy'、as: 'signout'

root to: "drinks#index" resources :glasses resources :ingredients resource :cabinet resources :drinks do get 'favorite', :on => :collection end resources :favorites

「お気に入り/番組」を取得

モデル user.rb

     has_one :cabinet
     has_many :favorite_drinks
     has_many :drinks, through: :favorite_drinks

モデル favorite_drink.rb

    attr_accessible :drink_id, :user_id

    belongs_to :user
    belongs_to :drink

VIEW _results.html.haml

   %td= link_to "favorite", favorite_drinks_path(drink_id: drink.id, type: "favorite"), method: "get"
   %td= link_to "unfavorite", favorite_drinks_path(drink, type: "unfavorite"), method: "get"

VIEW favorites/show.html.haml

   %table.table.table-striped
     %thead
       %tr
         %th Name
     %tbody
       - if @drinks.each do |drink|
         %tr
           %td= link_to drink.name, drink

私の更新されたコード

移行 create_favorite_drinks.rb

    class CreateFavoriteDrinks < ActiveRecord::Migration
     def change
       create_table :favorite_drinks do |t|
         t.integer :drink_id
         t.integer :user_id

         t.timestamps
       end
     end
   end
4

1 に答える 1

3

コードのその部分でエラーを引き起こしている 2 つのこと

  1. @drink は配列であるため、使用するユーザーのお気に入りの飲み物のリストに追加する前に、それぞれを反復処理する必要があります<<
  2. current_user.favorite_drinks << @drink -Drinkオブジェクトをfavorite_drinksテーブルにプッシュしているため、不一致があります

これに対する最善の解決策は、モデルを次のように設定することです

# user.rb
has_many :favorite_drinks
has_many :drinks, through: :favorite_drinks

# favorite_drink.rb
belongs_to :user
belongs_to :drink

# drink.rb
has_many :favorite_drinks
has_many :users, through: :favorite_drinks

これは、テーブルにuser_idandがあることを前提としています。それからあなたはただ使うことができますdrink_idfavorites_drinkscurrent_user.drink_ids = params[:drink_ids]

アップデート:

を使用していることに今気づきましたparams[:drink_id]。コントローラーコードを次のように変更します

@drink = Drink.find params[:drink_id]
current_user.drinks << @drink

そして、あなたは大丈夫なはずです

更新: @drink を if ブロックの外に移動して、タイプがお気に入りでない場合でもアクセスできるようにします

@drink = Drink.find params[:drink_id]

if type == "favorite"
  current_user.drinks << @drink
  redirect_to :back, notice: 'You favorites #{@drink.name}'
elsif type == "unfavorite"
  current_user.drinks.delete(@drink)
  redirect_to :back, notice: 'You unfavorited #{@drink.name}'
else
  redirect_to :back, notice: 'Nothing happened'
end
于 2013-02-26T01:44:26.803 に答える