为邮件系统保存错误的ID

时间:2014-12-17 19:31:45

标签: sql ruby-on-rails ruby-on-rails-4

我正在尝试在我的应用上设置一个消息传递系统并让它正常工作,但现在ActiveRecord正在为recipient_id保存错误的ID。

以下是user.id作为3加载的位置,但是当插入值时,消息的recipient.id5

User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 ORDER BY "users"."id" 
ASC LIMIT 1
Message Load (0.4ms)  SELECT "messages".* FROM "messages" LIMIT 1
User Load (0.6ms)  SELECT "users".* FROM "users" LIMIT 1
(0.5ms)  BEGIN

SQL (1.3ms)  INSERT INTO "messages" ("content", "created_at", "recepient_id", "sender_id", 
"subject",   "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["content", "erferfe"],
["created_at", Wed, 17 Dec 2014 19:15:08 UTC +00:00], ["recepient_id", 5], ["sender_id", 3], 
["subject", "erfer"], ["updated_at", Wed, 17 Dec 2014 19:15:08 UTC +00:00]]
(5.4ms)  COMMIT
Redirected to http://0.0.0.0:3000/messages
Completed 302 Found in 23ms (ActiveRecord: 9.6ms)

这是MessagesController#create

def create 
  @message = current_user.sent_messages.new(message_params)
  @message.recepient_id = User.find_by(params[:id]).id

  if @message.save
    flash[:notice] = 'Message has been sent.'
    redirect_to messages_path
  else 
    render :action => :new
  end
end

这是messages.rb

class Message < ActiveRecord::Base
  belongs_to :sender, class_name: "User", primary_key: "sender_id"
  belongs_to :recepient, class_name: "User", primary_key: "recepient_id"

  belongs_to :user

这是邮件的路由:

resources :users do
  resources :messages
end

这是观点:

<div class="ui button"><i class="mail icon"></i><%= link_to 'Message', new_user_message_path(@user) %></div>

Message_params:

def message_params
  params.require(:message).permit(:subject, :user_id, :content, :recepient_id)
end

User.rb

 class User < ActiveRecord::Base
    mount_uploader :avatar, AvatarUploader


# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, :omniauthable,
     :recoverable, :rememberable, :trackable, :validatable, 
     :omniauth_providers => [:facebook, :twitter]




TEMP_EMAIL_PREFIX = 'change@me'
TEMP_EMAIL_REGEX = /\Achange@me/

attr_accessor :login

has_many :projects, class_name: "Project", foreign_key: "creator_id"

has_many :sent_messages, class_name: "Message", foreign_key: "sender_id"

has_many :recieved_messages, class_name: "Message", foreign_key: 'recepient_id'

has_many :messages

has_many :projects, dependent: :destroy

has_many :authentications, :dependent => :destroy

validates :email, presence: true,
                  uniqueness: true,
                  format: {
                    with: /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9\.-]+\.[A-Za-z]+\Z/
                  }

validates_format_of :email, :without => TEMP_EMAIL_REGEX, on: :update






def downcase_email
 self.email = email.downcase                  
end

def generate_password_reset_token
    update_attribute(:password_reset_token, SecureRandom.urlsafe_base64(48))
end








def self.find_for_facebook_oauth(auth)
  user = User.where(:provider => auth.provider, :uid => auth.uid).first
  unless user
    user = User.create(:first_name => auth.extra.raw_info.first_name, 
                     :last_name => auth.extra.raw_info.last_name,
                     :avatar => auth.info.image,  
                     :provider => auth.provider, 
                     :uid => auth.uid,
                     :email => auth.info.email, 
                     :password => Devise.friendly_token[0,20]
                    )
    user.confirm!
  end
 user.save
end



def self.find_for_twitter_oauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
  user.provider = auth.provider 
  user.uid      = auth.uid 
  user.name     = auth.info.name
  user.avatar   = auth.info.image
  user.save
 end



end

建议更改代码后:

User Load (1.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY "users"."id" ASC  
LIMIT 1
Message Load (0.3ms)  SELECT "messages".* FROM "messages" LIMIT 1
(0.1ms)  BEGIN
SQL (0.4ms)  INSERT INTO "messages" ("content", "created_at", "sender_id", "subject", "updated_at")  

VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["content", "efvefvf"], ["created_at", Wed, 17 Dec 2014   
21:02:48 UTC +00:00], ["sender_id", 2], ["subject", "erfvef"], ["updated_at", Wed, 17 Dec 2014     
21:02:48 UTC +00:00]]
(7.2ms)  COMMIT

当我去/ users /:user_id / messages我的css和javascript文件不起作用

1 个答案:

答案 0 :(得分:0)

我假设此功能是从用户&#34;个人资料&#34;允许当前会话用户(发件人)向配置文件用户(收件人)发送邮件的页面。

首先,在消息模型中,消息模型上不需要belongs_to :user,用户模型上也不需要has_many :messages

接下来,您可以轻松完成#create操作:

def create 
  @message = current_user.sent_messages.new(message_params)
  @message.recipient_id = params[:user_id]

  if @message.save
    flash[:notice] = 'Message has been sent.'
    redirect_to messages_path
  else 
    render :action => :new
  end
end

现在,调整你的message_params。您不需要user_id(将由current_user提供),也不需要recipient_id(将由url param提供)。

def message_params
  params.require(:message).permit(:subject, :content)
end

试一试。