我的UserFriendship创建操作不保存user_id和friend_id [英] My UserFriendship create action does not save user_id and friend_id
问题描述
我使用'state_machine'gem。
一旦我创建一个新的UserFriendship,user_id和friend_id不保存。我甚至尝试通过传递user_id和friend_id直接在控制台中手动创建友谊,但仍然这些两个变量不保存即使友谊在数据库中创建,朋友和用户不保存。
UserFriendship模型:
class UserFriendship< ActiveRecord :: Base
belongs_to:user
belongs_to:friend,class_name:'User',foreign_key:'friend_id'
attr_accessor:user,:friend,:user_id,:friend_id ,:state
after_destroy:delete_mutual_friendship!
state_machine:state,initial::pending do
after_transition on::accept,do:[:send_acceptance_email,:accept_mutal_friendship!]
state:requested
event:accept do
transition any => :accepted
end
end
def self.request(user1,user2)
transaction do
friendship1 = UserFriendship.create! user_id:user1.id,friend_id:user2.id,state:'pending')
friendship2 = UserFriendship.create!(user_id:user2.id,friend_id:user1.id,state:'requested')
#friendship1.send_request_email
friendship1
end
end
def send_request_email
UserNotifier.friend_requested(id).deliver
end
def send_acceptance_email
UserNotifier.friend_request_accepted(id).deliver
end
def mutual_friendship
self.class。 where({user_id:friend_id,friend_id:user_id})。first
end
def accept_mutal_friendship!
mutual_friendship.update_attribute(:state,'accepted')
end
def delete_mutual_friendship!
mutual_friendship.delete
end
用户模型
class User< ActiveRecord :: Base
has_many:user_friendships
has_many:friends, - > {where(user_friendships:{state:accepted})},通过::user_friendships
has_many:pending_user_friendships, - > {where state:pending},class_name:'UserFriendship',foreign_key::user_id
has_many:pending_friends,through::pending_user_friendships,source::friend
UserFrienships控制器
UserFriendshipsController< ApplicationController
before_filter:authenticate_user!
def accept
@user_friendship = current_user.user_friendships.find(params [:id])
如果@ user_friendship.accept!
flash [:success] =您现在是#{@user_friendship.friend.name}的朋友
else
flash [:error] =无法接受友谊
end
redirect_to user_friendships_path
end
def new
if params [:friend_id]
@friend = User.find(params [:friend_id])
@user_friendship = current_user.user_friendships.new(friend:@friend)
raise ActiveRecord :: RecordNotFound if @ friend.nil?
else
flash [:error] =需要朋友
end
救援ActiveRecord :: RecordNotFound
渲染文件:'public / 404',status::not_found
end
def create
如果params [:user_friendship]&& params [:user_friendship] .has_key?(:friend_id)
@friend = User.find_by(id:params [:user_friendship] [:friend_id])
@user_friendship = UserFriendship.request(current_user,@friend )
如果@ user_friendship.new_record?
flash [:error] =创建该朋友请求时出现问题。
else
flash [:sucess] =朋友请求已发送
end
redirect_to current_user
else
flash [:error] =需要朋友
redirect_to root_path
end
end
def index
@user_friendships = current_user.user_friendships.all
end
def edit
@user_friendship = current_user.user_friendships.find(params [:id])
@friend = @ user_friendship.friend
end
def destroy
@user_friendship = current_user.user_friendships.find(params [:id])
如果@ user_friendship.destroy
flash [:success ] =友谊已销毁
redirect_to user_friendships_path
end
end
end
用户友谊新视图
<%if @friend%>
< h1><%= @ friend.name%>< / h1>
< p>你真的想要朋友<%= @ friend.name%>?< / p>
<%= form_for @user_friendship,method::post do | form | %>
< div class =form form actions>
<%= form.hidden_field:friend_id,value:@ friend.id%>
<%= submit_tag是,添加好友,class:'btn btn_primary'%>
<%= link_toCancel,user_path(@friend),class:'btn'%>
< / div>
<%end%>
<%end%>
迁移
class CreateUserFriendships< ActiveRecord :: Migration
def change
create_table:user_friendships do | t |
t.integer:user_id
t.integer:friend_id
t.timestamps
end
add_index:user_friendships,[:user_id,:friend_id]
end
end
上次迁移
class AddStateToUserFriendships< ActiveRecord :: Migration
def change
add_column:user_friendships,:state,:string
add_index:user_friendships,:state
end
end
来自最新schema.rb的UserFriendship表
create_tableuser_friendships,force:true do | t |
t.integeruser_id
t.integerfriend_id
t.datetimecreated_at
t.datetimeupdated_at
t.stringstate
end
add_indexuser_friendships,[state],name:index_user_friendships_on_state
add_indexuser_friendships,[user_id,friend_id],name:index_user_friendships_on_user_id_and_friend_id$您应该删除 friend_id 来自中的 attr_accessor
中的和 user_id
>模型,以便将这些值保存在 用户友谊& ActiveRecord :: Base
belongs_to:user
belongs_to:friend,class_name:'User',foreign_key:'friend_id'
attr_accessor:user,:friend,:state
-----
end
I am using the 'state_machine' gem.
Once I create a new UserFriendship, the user_id and friend_id do not get saved. I even tried creating manually the friendship in the console by passing the user_id and friend_id directly but still these two variables do not get saved even though the friendship gets created in the database, the friend and user are not saved . I do not know what 's wrong as it seems to me I am doing everything right.
The UserFriendship Model:
class UserFriendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'
attr_accessor :user, :friend, :user_id, :friend_id, :state
after_destroy :delete_mutual_friendship!
state_machine :state, initial: :pending do
after_transition on: :accept, do: [:send_acceptance_email, :accept_mutal_friendship!]
state :requested
event :accept do
transition any => :accepted
end
end
def self.request(user1, user2)
transaction do
friendship1 = UserFriendship.create!(user_id: user1.id, friend_id: user2.id, state: 'pending')
friendship2 = UserFriendship.create!(user_id: user2.id, friend_id: user1.id, state: 'requested')
#friendship1.send_request_email
friendship1
end
end
def send_request_email
UserNotifier.friend_requested(id).deliver
end
def send_acceptance_email
UserNotifier.friend_request_accepted(id).deliver
end
def mutual_friendship
self.class.where({user_id: friend_id, friend_id: user_id}).first
end
def accept_mutal_friendship!
mutual_friendship.update_attribute(:state, 'accepted')
end
def delete_mutual_friendship!
mutual_friendship.delete
end
User Model
class User < ActiveRecord::Base
has_many :user_friendships
has_many :friends, -> { where(user_friendships: { state: "accepted"}) }, through: :user_friendships
has_many :pending_user_friendships, -> { where state: "pending" }, class_name: 'UserFriendship', foreign_key: :user_id
has_many :pending_friends, through: :pending_user_friendships, source: :friend
The UserFrienships Controller
class UserFriendshipsController < ApplicationController
before_filter :authenticate_user!
def accept
@user_friendship = current_user.user_friendships.find(params[:id])
if @user_friendship.accept!
flash[:success] = "You are now friends with #{@user_friendship.friend.name}"
else
flash[:error] = "That friendship could not be accepted"
end
redirect_to user_friendships_path
end
def new
if params[:friend_id]
@friend = User.find(params[:friend_id])
@user_friendship = current_user.user_friendships.new(friend: @friend)
raise ActiveRecord::RecordNotFound if @friend.nil?
else
flash[:error] = "Friend Required"
end
rescue ActiveRecord::RecordNotFound
render file: 'public/404', status: :not_found
end
def create
if params[:user_friendship] && params[:user_friendship].has_key?(:friend_id)
@friend = User.find_by(id: params[:user_friendship][:friend_id])
@user_friendship = UserFriendship.request(current_user, @friend)
if @user_friendship.new_record?
flash[:error] = "There was a problem creating that friend request."
else
flash[:sucess] = "Friend request sent"
end
redirect_to current_user
else
flash[:error] = "Friend required"
redirect_to root_path
end
end
def index
@user_friendships = current_user.user_friendships.all
end
def edit
@user_friendship = current_user.user_friendships.find(params[:id])
@friend = @user_friendship.friend
end
def destroy
@user_friendship = current_user.user_friendships.find(params[:id])
if @user_friendship.destroy
flash[:success] = "Friendship destroyed"
redirect_to user_friendships_path
end
end
end
The User Friendship new view
<% if @friend %>
<h1><%= @friend.name %></h1>
<p> Do you really want to friend <%= @friend.name %>?</p>
<%= form_for @user_friendship, method: :post do |form| %>
<div class= "form form-actions" >
<%= form.hidden_field :friend_id, value: @friend.id %>
<%= submit_tag "Yes, Add Friend", class: 'btn btn_primary' %>
<%= link_to "Cancel", user_path(@friend), class: 'btn' %>
</div>
<%end%>
<%end%>
The Migrations
class CreateUserFriendships < ActiveRecord::Migration
def change
create_table :user_friendships do |t|
t.integer :user_id
t.integer :friend_id
t.timestamps
end
add_index :user_friendships, [:user_id, :friend_id]
end
end
Last Migration
class AddStateToUserFriendships < ActiveRecord::Migration
def change
add_column :user_friendships, :state, :string
add_index :user_friendships, :state
end
end
UserFriendship table from latest schema.rb
create_table "user_friendships", force: true do |t|
t.integer "user_id"
t.integer "friend_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "state"
end
add_index "user_friendships", ["state"], name: "index_user_friendships_on_state"
add_index "user_friendships", ["user_id", "friend_id"], name: "index_user_friendships_on_user_id_and_friend_id"
解决方案 You should remove friend_id
and user_id
from the attr_accessor
in user_friendship
model in order to save those values in the DB
class UserFriendship < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: 'User', foreign_key: 'friend_id'
attr_accessor :user, :friend, :state
-----
end
这篇关于我的UserFriendship创建操作不保存user_id和friend_id的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!