Rails Public Activity Gem - 创建动作控制器之后

时间:2015-10-10 22:20:27

标签: ruby-on-rails callback public-activity

我正在尝试使用Rails 4制作应用程序。

我已经安装了public_activity gem。

我跟随Ryan Bates Railscast并采用了基于控制器的方法,以及更轻的Common选项(而不是跟踪模型)。

在我的activities_controller中,我有:

class ActivitiesController < ApplicationController
  def index
      @activities = PublicActivity::Activity.order("created_at desc")
  end
end

在我的project.rb中,我有:

include PublicActivity::Common

在我的项目控制器中,创建动作,我有:

def create
    logger.debug "xxx create project"
    #authorise @project
    @project = Project.new(project_params)
    @project.creator_id = current_user.id
    @project.users << current_user
    @project.create_activity :create, owner: current_user

    respond_to do |format|
      if @project.save

        format.html { redirect_to @project }
        format.json { render action: 'show', status: :created, location: @project }
      else
        format.html { render action: 'new' }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

在我的活动视图中 - 索引,我有:

<% @activities.each do |activity| %>
        <div class="col-md-4">
          <div class="indexdisplay">

            <span class="indexheading"> 
              <%= link_to activity.owner.name, activity.owner if activity.owner %>
            </span>
            <span class="indexsubtext">                 
              <%= render_activity activity %>
            </span>

在我的公共活动(查看文件夹)/project/_create.html.erb中,我有:

<% if activity.trackable %>
  <%= link_to activity.trackable.name, activity.trackable %>
<% else %>
  which has since been removed
<% end %>

当我尝试这个时,它会给我一个空白页面(没有创建新的活动)。当我尝试创建一个新项目时,我不得不提交表单,因为我收到了这个错误:

ActiveRecord::RecordNotSaved at /projects
You cannot call create unless the parent is saved

问题在于我的项目控制器的创建操作中的这一行。

@project.create_activity :create, owner: current_user

是否有其他地方我可以将其放入控制器中以使其在项目保存后运行?我已经阅读了有关回拨的内容,但他们需要在模型中,我希望从控制器继续运行此过程。

1 个答案:

答案 0 :(得分:0)

作为错误状态,您正尝试为未保存的activity创建Project。保存activity

后移动@project的创建
def create
    logger.debug "xxx create project"
    #authorise @project
    @project = Project.new(project_params)
    @project.creator_id = current_user.id

    respond_to do |format|
      if @project.save

        @project.users << current_user
        @project.create_activity :create, owner: current_user

        format.html { redirect_to @project }
        format.json { render action: 'show', status: :created, location: @project }
      else
        format.html { render action: 'new' }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end