モデルにフォームを含むパーシャルをレンダリングしています。それは最も明白なことではないかもしれませんが、それでも私が試みていることです。
理論的根拠:
まず、なぜ私がそれをしているのかをやる気にさせましょう(別の方法を提案する場合は、お気軽にどうぞ):
アプリのユーザー向けにシンプルなメッセージング機能を構築しているため、ユーザーがアクションを実行する必要がある場合は、メッセージを通じて通知され、メッセージには実行するデータとアクションが含まれます。
例:ユーザーは、特定のグループに参加するための招待状を受け取っています。招待状には、グループの所有者の名前、グループの名前、および招待を受け入れるか無視するための2つのボタンが含まれています。
コード:
メッセージモデルは次のとおりです。
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の定義を含める/要求する必要があると思います。しかし、そうしようとしても成功しませんでした。
それで、それを見ている賢い人がいるなら、彼はこれを解決するためのいくつかのアイデアを私にくれてとても親切になるかもしれません。
多くの人が期待して感謝します