【发布时间】:2011-02-19 09:45:43
【问题描述】:
我正在用 Rails 编写一个(文本)消息应用程序。我正在使用nested_forms 允许您向多个人发送消息。
在控制器中,我实例化了一个新的 Message 对象,然后为每个 Member 构建一个 Recipient 对象(Message 的子对象)。在表单中,我在每个收件人旁边显示一个复选框。我想要它,以便新的 Message 对象只有旁边有支票的收件人。这不起作用。
因此,在呈现表单时,所有成员都会实例化 Recipient 对象。换句话说,默认情况下,除非指定不发送,否则会向每个成员发送一条消息。但我想使用表单允许用户指定他希望将消息发送给谁
这是我的模型:
class Message < ActiveRecord::Base
has_many :recipients
accepts_nested_attributes_for :recipients
#columns: body:string, from:string, from_member_id:integer
end
class Member < ActiveRecord::Base
#columns phone:string, name:string
end
class Recipient < ActiveRecord::Base
belongs_to :message
belongs_to :member
#columns: member_id:integer, message_id:integer
end
messages_controller.rb:
def new
@message = Message.new
@members = Member.all
@members.each do |member|
@message.recipients << Recipient.new(:member_id => member.id)
end
end
def create
@message = Message.new(params[:message])
redirect_to '/somewhere'
end
...
这是我的Message (app/views/message/new/html.erb) 表单
<%= form_for(@message) do |f| %>
<% if @message.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@message.errors.count, "error") %> prohibited this message from being saved:</h2>
<ul>
<% @message.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.fields_for :recipients do |builder| %>
<div class="field">
<input type="checkbox" value="<%= builder.object.member_id %>" name="recipients[id]" />
/*WHAT GOES ^^^HERE^^^? */
<%= builder.object.member.name %>
</div>
<% end %>
<div class="field">
<%= f.label :body %><br />
<%= f.text_field :body %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
表单中的注释行是我遇到问题的地方。另外,似乎我可能需要修改 MessagesController#create 中的一些代码,但我不确定从哪里开始。
【问题讨论】:
标签: ruby-on-rails ruby nested-forms