1

と の 2 つのモデルがActivityありCommentます。Comment belongs_to :activityActivity 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 つのブロックがあります。

  • activityform for activity更新目的で
  • activity.commentsでブロックeach do |comment|
  • activity.comments.new(形)

そして、これは問題です。1 つのビューに 2 つのフォームと 2 つのアクションを呼び出す 2つのボタンがあるため、コントローラーActivity.commentsから新しいコメントを作成するためのレンダリングとフォームが必要です。もちろん、アプリのロジックを改善するためにも必要です。commentssubmitupdatecreate

しかし、このパーシャル to のどこでも使用するactivityfromを送信することはできません。@activities.each do |activity|comments_controller

@activity = Activity.find(params[:id])@comment = Activity.comments.new(params[:activity_id])、およびコントローラーを追加しようとしましたが、 および@comments = Activity.comments.allに変更しました。しかし、それは役に立ちません。コントローラー間の相互作用の基本的なロジックを理解していないと思いますが、間違いを見つけることができません。activitiescommentsactivity@activityactivity.comments.new@comment

したがって、私activities_controllerindexアクションは次のとおりです。

@activities = Activity.order('updated_at DESC')

そして、私にはとアクションcomments_controllerしかありません。これは正常に機能します。createdestroy

助けてくれてありがとう!

更新:

これは私の_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 %>
4

1 に答える 1

0

問題は、ネストされたフォームにありました。そのため、新しいコメントのフォームを送信すると、更新アクティビティの親フォームも送信されました。

于 2013-06-16T20:17:29.390 に答える