1

我正在渲染模型中包含表单的部分。好吧,这可能不是最明显的事情,但仍然:这就是我正在尝试的。

理由:

让我首先说明我为什么这样做(如果您有其他方式的建议,请随意):

我正在为我的应用程序的用户构建一个简单的消息传递功能,以便当他们需要执行某个操作时,他们会通过消息得到通知,并且该消息包含要执行的数据和操作。

一个例子:用户正在收到加入给定组的邀请。邀请包含群组所有者的姓名、群组的名称和两个用于接受或忽略邀请的按钮。

编码:

这是消息模型:

class Message < ActiveRecord::Base

  def self.group_invitation(group, user)
    @m=Message.new({
                     :status => :unread,
                     :from_user_id => group.owner.id,
                     :to_user_id => user.id,
                     :type => :group_invitation,
                     :title => "Invitation to the group: #{group.name}.",
                     :message => ActionController::Base.new.send(:render_to_string,
                                :partial => 'messages/group_invitation',
                                            :locals => {:group => group,
                                                        :user => user}
                                                                 )
                  })
    @m.save!
  end
end

这是我在模型中渲染的部分内容(即'messages/group_invitation'):

<div>
  <h1> Invitation to <%= group.name %> </h1>
  <p>
    Hello <%= user.name %>,
  </p>
  <p>
    You have been invited by <%= group.owner.name %> to join the group
    <%= group.name %>.
  </p>
</div>

<div>
Please take one of the following action:
<br/>
     <%=  m= group.memberships.find_by_user_id(user.id)
       m.status = :validated
       render 'memberships/form', :membership => m, :method =>
       :put, :label => "Accept" %>
<br/>
    <%= render 'memberships/form', :membership => m, :method =>
      :delete, :label => "Ignore" %>
</div>

其中“成员资格/表格”部分是:

<%= form_for membership, :html => {:method => method} do |f| %>
 <%= f.hidden_field :group_id %>
 <%= f.hidden_field :user_id %>
 <%= f.hidden_field :status %>
 <%= f.submit :value => label %>
<% end %>

用户拥有在发送邀请时创建的组的成员资格,该组的状态为“已邀请”。用户将收到一条内部消息,其中包含将成员资格更新为“已验证”状态的能力。

如果没有表格,则可以正确生成邀请,但使用表格时,我在“会员资格/表格”部分的第一行收到以下错误:

undefined method `host_with_port' for nil:NilClass

我假设我必须在某处包含/要求 urlherlpers 的定义,以便渲染生成正确的路径等。但我这样做的尝试并没有取得任何成功。

所以如果有一些聪明的人在看它,他可能会很友善地给我一些解决这个问题的想法。

非常感谢期待

4

0 回答 0