Ошибка: ActiveRecord автоматически экранирует входной массив из check_box_tag (Rails 3) - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть модель PrivateMessage, чье поле: to может содержать несколько идентификаторов получателей.

create_table :private_messages do |t|
  t.integer :author_id
  t.string :subject
  t.text :body
  t.text :to
  t.timestamps

Я использую check_box_tag, чтобы позволить отправителю выбрать получателей, которым он хочет отправить:

<% for friend in User.find(:all) %>
  <%=raw check_box_tag "private_message[to][]", friend.id, @private_message.to.include?(friend.id)%> 
  <%= friend.username %><br />
<% end %>

Когда пользователь выбирает несколько получателей, параметры передаются ОК:

tarted POST "/sent" for 127.0.0.1 at 2011-09-04 11:02:26 -0400
  Processing by SentController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"XXX", "private_message"=>{"to"=>["8", "9", "10"], "subject"=>"test"}, "commit"=>"Send"}

Однако, когда строка вставляется в мою таблицу, она автоматически экранируется следующим образом:

  SQL (0.4ms)  INSERT INTO "private_messages" ("author_id", "body", "created_at", "subject", "to", "updated_at") VALUES (10, '2011-09-04 15:20:47.009706', 'test', '--- 
- "8"
- "9"
- "10"
', '2011-09-04 15:20:47.009706')

Когда я проверяю запись на моей консоли:

ruby-1.9.2-p180 :010 > PrivateMessage.last.to
 => "--- \n- \"8\"\n- \"9\"\n- \"10\"\n" 

У меня вопрос: как мне записать: как «7», «8», «10»?

Большое спасибо за помощь!

P / S: Я следую инструкциям здесь: http://www.novawave.net/public/rails_messaging_tutorial.html

1 Ответ

0 голосов
/ 04 сентября 2011

Вы не должны использовать одно поле для хранения ссылок на нескольких получателей.Вместо этого ваши модели должны выглядеть следующим образом:

class PrivateMessage
  has_and_belongs_to_many :recipients
end

class Recipient
  has_and_belongs_to_many :private_messages
end

Таким образом, ваши модели PrivateMessage и Recipient будут связаны через третью таблицу (вам не нужно об этом беспокоиться, Rails сделает все фоновые операции за вас), и вы получите геттеры и сеттеры, такие как

@private_message.recipients = Recipient.find_by_id(params[:to])

или

@private_message.recipients_singular_ids = params[:to].to_a

Это не полностью отвечает на ваш вопрос, но я думаю, что вы обязательно должны выглядеть именно так.Я также настоятельно рекомендую прочитать руководство RoR / AR об ассоциациях: http://guides.rubyonrails.org/association_basics.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...