ユーザーが表示できる事前定義された飲み物のリストがあるアプリがあります。ユーザーが飲み物をお気に入り/お気に入りから外す機能を提供しようとしています。
お気に入りのリンクをクリックすると、何らかの理由で 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