自引用关联——Rails中的友化特性



我正在尝试为一个基本的社交网站建立一个简单的交友系统。我只需要我的"Wag"链接来触发一个动作,将当前宠物收藏到主人的收藏页面。我跟随RailsCast在这里设置了一切。

这是我试图建立的路径链接。

<% @pets.each do |pet| %>
  <div>
   <%= link_to "Wag", owner_friendships_path(friend_id: owner), method: :post %>
  </div>
 <% end %>
</div>

应该放在这里:

<ul>
 <% for friendship in @owner.friendships %>
  <li>
   <%= friendship.friend.name %>
   (<%= link_to "remove", friendship, method: :delete %>)
   </li>
  <% end %>
</ul>
<p><%= link_to "Find Puppy Pals", pets_path %></p>

路线:

 Rails.application.routes.draw do
  devise_for :owners
  resources :pets
  resources :owners do
   resources :pets, shallow: true
   resources :friendships
  end
  root to: "pets#index"
end

相关模式如下:

create_table "friendships", force: true do |t|
 t.integer  "owner_id"
 t.integer  "friend_id"
 t.datetime "created_at"
 t.datetime "updated_at"
end
create_table "owners", force: true do |t|
 t.string   "email",                  default: "", null: false
 t.string   "encrypted_password",     default: "", null: false
 ...(devise defaults)
 t.datetime "created_at"
 t.datetime "updated_at"
 t.string   "profile_photo"
end

My friendship controller:

class FriendshipsController < ApplicationController
 def index
  @friendships = Friendship.all
 end
 def show
  @friendship = Friendship.find(params[:id])
 end
def create
 @friendship = current_owner.friendships.build(params[:friend_id])
 if @friendship.save
  flash[:notice] = "Added puppy pal."
  redirect_to root_url
 else
  flash[:error] = "Oops, we couldn't save that puppy pal."
  redirect_to root_url
 end
end
def destroy
  @friendship = current_owner.friendships.find(params[:id])
  @friendship.destroy
  flash[:notice] = "Removed puppy pal."
  redirect_to root_url
 end
end

宠物控制器:

Class PetsController < ApplicationController
 def index
  @pets = Pet.order("RANDOM()").limit(1)
 end
 def new
  @pet = Pet.new
 end
def create
 @pet = Pet.new(pet_params)
 @pet.owner_id = current_owner.id if current_owner
if @pet.save
  flash[:notice] = 'Your pet profile was saved!'
  redirect_to pets_path
else
  flash.now[:notice] = 'Your pet profile could not be saved.'
  render :new
 end
end
def show
 @pet = Pet.find(params[:id])
end
def edit
 @pet = Pet.find(params[:id])
end
def update
 @pet = Pet.find(params[:id])
 if @pet.update(pet_params)
  redirect_to pets_path
 else
  render :edit
 end
end
def destroy
 @pet = Pet.find(params[:id])
 if current_owner == @pet.owner
  @pet.destroy
  redirect_to pets_path
 end
end
private
def pet_params
 params.require(:pet).permit(:name, :breed, :age,
  :color, :weight, :personality, :favorite_things, :owner_id, :profile_photo)
 end
end

Pets Table:

create_table "pets", force: true do |t|
 t.string   "name"
 t.string   "breed"
 t.integer  "age"
 t.integer  "weight"
 t.text     "personality"
 t.text     "favorite_things"
 t.integer  "owner_id"
 t.datetime "created_at"
 t.datetime "updated_at"
 t.string   "profile_photo"
end

Owner Controller:

 class OwnersController < ApplicationController
  def show
  @pet = Pet.find(params[:id])
 end
  def edit
   @owner = Owner.find(params[:id])
  end
 end

你需要改变这一行:

<%= link_to "Wag", friendships_path(friend_id: owner), method: :post %>

:

<%= link_to "Wag", friendships_path(friend_id: pet.owner_id), method: :post %>

owner从来没有被自己定义。无论你调用什么(我猜是基于你的数据库模型的owner_id)需要在块

pet的实例上调用。

最新更新