1

私はモデル Messages を持っています。これには、文字列として保存する recipient_list があります。保存時になんらかの理由で、recipient_list 以外のすべてのパラメーターが保存され、recipient_list だけが除外されます。これは何が原因なのだろうと頭を悩ませています。

モデル:

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">] 

この場合、recipient_list が保存されない原因は何でしょうか?

編集:

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: serialize :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

ライターメソッドにタイプミスがあると思います。という名前の引数を渡していますが、 をrecipient呼び出しますrecipients.split(",")。どちらかを変更すると、設定されます。

于 2012-08-22T20:48:12.600 に答える
1

superオーバーライドされたライターでメソッドを呼び出す必要があるようです:

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

または同様のものは、コードによって異なります。

于 2012-08-22T20:40:27.590 に答える