1

我有一个模型消息,我有一个收件人列表,它保存为字符串。无论出于何种原因,除了收件人列表之外,我的所有参数都被保存,只有收件人列表被遗漏。我很困惑这可能是什么原因。

模型:

class Message < ActiveRecord::Base
  attr_accessible :content, :sender_id, :recipient_list
  attr_reader :recipient_list #necessary for jquery-token-input

  belongs_to :sender, class_name: "User"

  validates :content, presence: true
  validates :sender_id, presence: true
  validates :recipient_list, presence: true

  def recipient_list=(recipient) #jquery-token-input
    self.recipient_ids = recipients.split(",")
  end

end

控制器:

def create
  @message = current_user.sent_messages.build(params[:message])
  if @message.save
    flash[:success] = "Message Sent."
    redirect_to '/users/'+current_user.id.to_s+'/messages'
  else
    redirect_to '/users/'+current_user.id.to_s+'/messages'
  end
end

参数:

{"utf8"=>"✓",
"authenticity_token"=>"WlStV4ogguSX72vrZp10zJbucS5MTL1pT1DLt06qjcw=",
"message"=>{"recipient_list"=>"1,2",
"content"=>"foobar123",
"sender_id"=>"1"},
"commit"=>"Send"}

结果:

#<Message id: 32, content: "foobar123", sender_id: 1, recipient_list: "", created_at: "2012-08-22 19:38:44", updated_at: "2012-08-22 19:38:44">] 

在这种情况下,导致收件人列表无法保存的问题可能是什么?

编辑:

Par Ylan 的笔记我开始研究为什么它在变量名不同的情况下仍然有效。在弄乱它后,我意识到它实际上只有在我设置收件人 - > 收件人或相反它会停止工作时才以这种方式工作。

摆弄它,并根据纳什的建议提出以下建议:

def recipient_list=(ids)
 recipient_list = ids.split(",")
 super(recipient_list)
end


#<Message id: 42, content: "foobar123", sender_id: 1, recipient_list: "---\n- '1'\n", created_at: "2012-08-22 21:58:46", updated_at: "2012-08-22 21:58:46">] 

所以现在收件人列表正在保存,我只需要弄清楚如何删除所有不必要的乱码并只得到“1”哈哈。有什么进一步的建议吗?

编辑#2: 添加序列化后:recipient_list, Array

#<Message id: 43, content: "foobar123", sender_id: 1, recipient_list: ["1", "2"], created_at: "2012-08-22 22:10:46", updated_at: "2012-08-22 22:10:46">] 

是我想要的新输出。我们一起工作。谢谢两位。

4

2 回答 2

1

看起来您应该super在覆盖的编写器中调用方法:

def recipient_list=(recipients) #jquery-token-input
  self.recipient_ids = recipients.split(",")
  super(recipients)
end 

或类似的东西取决于您的代码。

于 2012-08-22T20:40:27.590 回答
1

我相信你的写作方法有误。您正在传递一个名为 的参数recipient,但调用recipients.split(","). 改变任何一个,你应该被设置。

于 2012-08-22T20:48:12.600 回答