2013-05-02 25 views
0

我收到一個錯誤,但我不明白爲什麼。我有一個表單傳遞給控件輸入以創建一個模型實例。創建模型實例的問題 - Ruby on Rails中的TypeMismatch錯誤

下面的形式:

=form_for :message, :url => {:action => 'create', :controller => 'messages'} do |f| 
    =f.text_area :body, :placeholder => 'Enter your message.', :size => '40x5' 
    =f.hidden_field :subject, value: "RE:#{@message.subject}" 
    =f.hidden_field :parent, value: @message.id 
    =f.hidden_field :receiver, value: @message.sender 
    =f.submit 'Reply' 

這裏是控制器:

def create 
    user = User.find_by_username(params[:message][:receiver])#remove receiver and give it a varibale -rg 4/29 
    if user ||= User.find_by_id(params[:message][:receiver]).username#valid entry -rg 4/29 
     params[:message].delete('receiver') 
     params[:message][:status] = 'unread'#set status -rg 4/29 
     params[:message][:sender] = @current_user#set sender -rg 4/29 
     # raise params.inspect 
13 => @message = Message.create!(params[:message])#create message! -rg 4/29 
     if parent = params[:message][:parent]#checks if this is a reply to another message -rg 4/29 
      Message.find_by_id(parent).update_attributes(:child => @message)#updates parent message to have this message as child -rg 4/29 
     end 
     @message.received<<user#adds receiver to database 
     flash[:notice] = "Message was successfully sent." 
     redirect_to messages_path 
    else 
     flash[:warning] = "There is no user with that username." 
     redirect_to messages_path 
    end 
end 

我的消息模型:

class Message < ActiveRecord::Base 
    attr_accessible :body, :subject, :status, :sender, :receiver,:parent, :child 
    belongs_to :sent, :class_name => 'User' 
    has_and_belongs_to_many :received, :class_name => 'User' 
    belongs_to :parent, :class_name => 'Message' 
    has_one :child, :class_name => 'Message' 
end 

我得到的錯誤,包括跟蹤:

ActiveRecord::AssociationTypeMismatch in MessagesController#create 

Message(#41016000) expected, got String(#17696120) 

Rails.root: /home/renee/classes/SE/Brainstormy 
Application Trace | Framework Trace | Full Trace 

app/controllers/messages_controller.rb:13:in `create' 

這裏是正在傳遞的PARAMS:

{"utf8"=>"✓", 
"authenticity_token"=>"yLYTXNTjluDk15dm554vpjom7hlQCC2d+hGmkuLJcEE=", 
"message"=>{"body"=>"j", 
"subject"=>"RE:j", 
"parent"=>"1", 
"status"=>"unread", 
"sender"=>2}, 
"commit"=>"Reply"} 

這很有趣,因爲我有一個使用完美的作品相同的控制器第二種形式。看來,我的額外領域:parent是罪魁禍首。但我想不想傳遞消息。我想要的是通過一個整數即id。但它以字符串形式傳遞。誰能幫我解決這個問題嗎?

+0

向我們展示該請求的參數,尤其是params [:message] – 2013-05-02 18:44:55

+0

爲什麼不只是params [:message] [:parent] = params [:message] [:parent] .to_i在創建對象之前? – Mattherick 2013-05-02 18:51:58

+0

我想過這個。但是,由於某種原因,這是行不通的,因爲期望一個對象,而不是一個字符串或一個int – BooBailey 2013-05-02 18:54:12

回答

1

這是因爲您正在將字符串(f.hidden_field :parent, value: @message.id)傳遞到需要Message對象的父關聯方法中。你想要做的是將父關聯的foreign_key字段設置爲消息ID。

如果foreign_key是PARENT_ID,則隱藏字段應該是這樣的:

f.hidden_field :parent_id, value: @message.id 

你必須檢查是否使:parent訪問是一樣的製作:parent_id訪問,否則它不會設置。

+0

感謝您的答覆,阿蘭!我按照你的建議做了,但我仍然得到這個錯誤。 – BooBailey 2013-05-02 21:04:12

+0

嘗試在您的控制器操作中手動設置它並查看它是否仍然存在錯誤: #MessagesController#create @ message.parent = Message.find_by_id(params [:parent_id]) – 2013-05-02 21:22:37

+0

我懂了,謝謝! – BooBailey 2013-05-02 21:42:40