未定义的方法'find_by_targetable_id'rails活动

时间:2013-10-14 17:28:42

标签: ruby-on-rails android-activity destroy

我已经创建了一个活动模型,我试图让它在用户删除活动时删除相应的状态。我已经能够在删除状态时执行此操作,它会删除活动但不确定如何在相反的方向上执行此操作。我尝试通过targetable_id查找状态,但我得到了:

undefined method `find_by_targetable_id' for #<Class:0x8df4a70>

Parameters:

{"_method"=>"delete",
 "authenticity_token"=>"s2wKOZxCBVarT5uge3AIFNXHepFuvNGM+kU/q+ArOjA=",
 "id"=>"18"}

如果你熟悉public_activity gem,那么targetstable与trackable相同,在这个例子中,activity id是18,它的对应状态id是53

ActivitiesController

class ActivitiesController < ApplicationController

  before_filter :authenticate_member!, only: [:destroy]
  before_filter :find_activity, only: [:destroy]

  def index
    following_ids = current_member.following_members.map(&:id)
    @activities = Activity.where("member_id in (?)", following_ids.push(current_member.id)).order("created_at desc").all
  end

  def destroy
    @status = Activity.targetable 
        if @status      
            @status.destroy
        end
    @activity.destroy

    respond_to do |format|
      format.html { redirect_to :back }
      format.json { head :no_content }
    end
  end

  private

  def find_activity
    @activity = current_member.activities.find(params[:id])
  end 

end

StatusesController

class StatusesController < ApplicationController

  before_filter :authenticate_member!, only: [:new, :create, :edit, :update, :destroy] 
  before_filter :find_member
  before_filter :find_status, only: [:edit, :update, :destroy, :show]

  rescue_from ActiveRecord::RecordNotFound do
    render file: 'public/404', status: 404, formats: [:html]
  end


  # GET /statuses
  # GET /statuses.json
  def index
    @statuses = Status.order('created_at desc').all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @statuses }
    end
  end

  # GET /statuses/1
  # GET /statuses/1.json
  def show

    respond_to do |format|
      format.html # show.html.erb
      format.json { redirect_to profile_path(current_member) }
    end
  end

  # GET /statuses/new
  # GET /statuses/new.json
  def new
    @status = Status.new
    @status.build_document

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @status }
    end
  end

  # GET /statuses/1/edit
  def edit

  end

  # POST /statuses
  # POST /statuses.json
  def create
    @status = current_member.statuses.new(params[:status])

    respond_to do |format|
      if @status.save
        current_member.create_activity(@status, 'created')
        format.html { redirect_to :back }
        format.json 
      else
        format.html { redirect_to profile_path(current_member), alert: 'Post wasn\'t created. Please try again and ensure image attchments are under 10Mbs.'  }
        format.json { render json: @status.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /statuses/1
  # PUT /statuses/1.json
  def update

    if params[:status] && params[:status].has_key?(:user_id)
        params[:status].delete(:user_id) 
    end 
    respond_to do |format|
      if @status.update_attributes(params[:status])
        format.html { redirect_to profile_path(current_member), notice: 'Status was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @status.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /statuses/1
  # DELETE /statuses/1.json
  def destroy
    @activity = Activity.find_by_targetable_id(params[:id])
    if @activity
      @activity.destroy
    end 
    @status.destroy

    respond_to do |format|
      format.html { redirect_to :back }
      format.json { head :no_content }
    end
  end

  private
  def find_member
    @member = Member.find_by_user_name(params[:user_name])
  end 

  def find_status
    @status = current_member.statuses.find(params[:id])
  end 

  def sortable_date
    created_at
  end 

end

1 个答案:

答案 0 :(得分:0)

不应该这一行

@status = Activity.targetable

@status = @activity.targetable

第二个注意事项:将状态销毁移至Activity模型before_destroy回调可能会更好。