と の 2 つのモデルがActivity
ありComment
ます。Comment
belongs_to :activity
とActivity
has_many :comments
。アクティビティの作成については、この Railscast に従いました(アクティビティ フィードを最初から)
だから、私は使用していますactivity_presenter.rb
class ActivityPresenter < SimpleDelegator
attr_reader :activity
def initialize(activity, view)
super(view)
@activity = activity
end
def render_activity
div_for activity do
link_to((gravatar_for activity.user, {size: 20}) + activity.user.name, activity.user) + ' ' + render_partial
end
end
def render_partial
locals = {activity: activity, presenter: self}
locals[activity.trackable_type.underscore.to_sym] = activity.trackable
render partial_path, locals
end
def partial_path
partial_paths.detect do |path|
lookup_context.template_exists? path, nil, true
end || raise("No partial found for activity in #{partial_paths}")
end
def partial_paths
[
"activities/#{activity.trackable_type.underscore}/#{activity.action}",
"activities/#{activity.trackable_type.underscore}",
"activities/activity"
]
end
end
_activities_feed.rb
条件付きで部分的にレンダリングし@activities.each do |activity|
ます。
このパーシャルには 3 つのブロックがあります。
activity
form for activity
更新目的でactivity.comments
でブロックeach do |comment|
activity.comments.new
(形)
そして、これは問題です。1 つのビューに 2 つのフォームと 2 つのアクションを呼び出す 2つのボタンがあるため、コントローラーActivity.comments
から新しいコメントを作成するためのレンダリングとフォームが必要です。もちろん、アプリのロジックを改善するためにも必要です。comments
submit
update
create
しかし、このパーシャル to のどこでも使用するactivity
fromを送信することはできません。@activities.each do |activity|
comments_controller
@activity = Activity.find(params[:id])
、@comment = Activity.comments.new(params[:activity_id])
、およびコントローラーを追加しようとしましたが、 および@comments = Activity.comments.all
に変更しました。しかし、それは役に立ちません。コントローラー間の相互作用の基本的なロジックを理解していないと思いますが、間違いを見つけることができません。activities
comments
activity
@activity
activity.comments.new
@comment
したがって、私activities_controller
のindex
アクションは次のとおりです。
@activities = Activity.order('updated_at DESC')
そして、私にはとアクションcomments_controller
しかありません。これは正常に機能します。create
destroy
助けてくれてありがとう!
更新:
これは私の_activities_feed.rb
構造です:
<% @activities.each do |activity| %>
<%= form_for activity, remote: true do |a| %>
<%= ActivityPresenter.new(activity, self).render_activity %>
.
.
.
<%= link_to ... class: 'add_comment', remote: true %> # Shows activity.new.comment form
<%= link_to ... 'Edit' ... %> # edit activity link
<%= a.submit 'Update' %> # first submit button for submitting activity changes
.
.
.
<% activity.comments.each do |comment| %> # activity.comments block
<%= comment.text %>
<%= link_to comment.user.name, comment.user %>
<% end %>
.
.
.
<%= form_for activity.comments.new, remote: true do |f| %> # form for adding comment
<%= f.text_area :text, 'rows' => '2', class: 'comment_text' %>
<%= f.button 'Cancel', class: 'btn comment_cancel', type: 'button' %>
<%= f.submit 'Post', class: 'btn btn-primary', controller: 'comments' %> # second submit button
<%= f.hidden_field :activity_id, value: activity.id %>
<% end %>
<% end %>
<% end %>