【问题标题】:Send data between controllers在控制器之间发送数据
【发布时间】:2013-06-16 15:28:54
【问题描述】:

我有两个模型:ActivityCommentCommentbelongs_to :activityActivityhas_many :comments。对于建筑活动,我关注了这个Railscast (Activity feed from scratch)

所以,我正在使用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.each do |activity| 条件呈现_activities_feed.rb 部分。

在这部分我有 3 个块:

  • activityform for activity 用于更新目的
  • activity.commentseach do |comment| 阻止
  • activity.comments.new(表格)

这是一个问题。我需要渲染Activity.comments 和表单以从comments 控制器创建新评论,因为我在一个视图中有2 个表单和2 个submit 按钮,它们调用2 个updatecreate 操作。当然,我需要它来改进应用逻辑。

但我无法从@activities.each do |activity| 发送activity,我在此部分中到处使用comments_controller

我尝试将@activity = Activity.find(params[:id])@comment = Activity.comments.new(params[:activity_id])@comments = Activity.comments.all 添加到activitiescomments 控制器,并将activity 更改为@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 %>

【问题讨论】:

  • 我更喜欢这个问题更加抽象和集中,而不是倾倒所有细节。我很难理解你的详细领域逻辑的真正问题是什么。
  • 我希望你能告诉我们你所说的form
  • 对不起,忘记表格了。已添加。

标签: ruby-on-rails ruby-on-rails-3 model-view-controller


【解决方案1】:

问题在于嵌套表单。所以,当我提交新评论的表单时,它也提交了更新活动的父表单。

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多