在Rails 3中向before_create回调传递参数

3
我正在为一个社交网络平台实现一种类似于Facebook的消息系统,灵感来自于这个教程: http://www.novawave.net/public/rails_messaging_tutorial.html
我已经实现了基本的发送消息功能,现在想让用户能够保存草稿以便日后发送。
当创建一条消息时,在我的消息模型的before_create方法中,它会为每个收件人创建该消息的副本。
to.each do |recipient|
    recipient = User.find(recipient)
    message_copies.build(:folder_id => recipient.inbox.id, :recipient_id => recipient.id, :read => false)
  end

我希望在before_create回调中传递参数,以便确定是否将消息副本构建给收件人或仅将其保存为草稿,从而可以在不更改模型的情况下使用相同的方法。 我考虑跳过此特定情况的回调,但无法理解如何做到这一点。
以下是创建新消息的视图: <% form_for @message, :url => {:controller => "sent", :action => "create"} do |f| %>
<select name="message[to][]" multiple="multiple">
    <%= options_from_collection_for_select(User.find(:all), :id, :login, @message.to) %>
</select>

<p>
    Subject: <%= f.text_field :subject %>
</p>

<p>
    Body:
    <br />
    <%= f.text_area :body %>
</p>

<p>
    <%= submit_tag "Send", :name => 'do_send' %>
    <%= submit_tag "Save", :name => 'save_draft' %>
</p>

<% end %>

有什么建议吗?

谢谢

编辑:更多代码!

2个回答

1

你可能会有类似条件回调的东西

class Comment < ActiveRecord::Base
  before_create :send_email_to_author, :if => :author_wants_emails?,
    :unless => Proc.new { |comment| comment.post.ignore_comments? }
end

还有一个虚拟属性,用于决定是将消息副本发送给收件人,还是将其保存为草稿。


我不知道什么是虚拟属性。正在查看中。 - Arthur
那么,当点击保存按钮时,应该设置:author_wants_emails吗?我应该在哪里设置它? - Arthur

1

我认为你可以借助Ajax将消息和消息接收者存储在数据库中。这样一来,你就可以像Gmail一样在以后继续处理消息。

另一个选择是在表单上设置两个不同的提交按钮,一个是“发送”,一个是“保存为草稿”。根据提交参数的不同,你可以进行相应的消息处理。


我完全不了解Ajax。我的表单上有两个不同的提交按钮,分别导致两个不同的操作。问题是我想使用相同的构建方法和回调函数。也许我不应该这样做? - Arthur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接