1

我希望将其标记为不可见,而不是删除指南(因此它仍在我的数据库中,但用户不会看到它列出)。这有几个主要问题

  1. 我似乎无法从视图中删除指南
  2. 当我尝试查看我的管理员端 - 指南时,我收到错误

ActionView::Template::Error(未定义的方法 `comment_ids_contains' for #):

我怀疑没有 2 是不相关的,但在我进行以下更改之前并没有给我造成问题。在我的guidelines.rb 模型中,我添加了

default_scope where(:visible => true)
attr_accessible :visible

在 guideline_controller.rb 我将销毁和创建操作更改为

def destroy
    @guideline = Guideline.find(params[:id])
    @guideline.visible=false
    #@guideline.destroy
    respond_to do |format|
      format.html { redirect_to guidelines_url }
      format.json { head :no_content }
    end
  end


def create
    @guideline = current_user.guidelines.new(params[:guideline])
    @guideline.visible=true

    respond_to do |format|

      if @guideline.save
        format.html { redirect_to @guideline, notice: 'Guideline was successfully created.' }
        format.json { render json: @guideline, status: :created, location: @guideline } 
      else
        @specialties = Guideline.order(:specialty).uniq.pluck(:specialty)
        format.html { render action: "new" }
        format.json { render json: @guideline.errors, status: :unprocessable_entity }
      end
    end
  end

在 admin/guidelines.rb 我添加

   column :visible

我添加了一个数据库迁移

class AddVisibleColumnToGuidelines < ActiveRecord::Migration
  def change
    add_column :guidelines, :visible, :boolean   
  end
end
4

3 回答 3

2

首先,做:

@guideline.visible=false

还不够,因为您只更改了 Ruby 对象。您必须调用save!将更改传播回数据库:

@guideline.visible = false
@guideline.save!

您也可以使用update_attribute一步完成:

@guideline.update_attribute(:visible, false)

尽管此方法跳过了一些步骤(例如验证),但最好先阅读一下

另一件事是您可能应该使用以下代码来查找指南,除非您希望其他用户删除彼此的指南:

current_user.guidelines.find(params[:id])
于 2013-03-09T10:19:26.650 回答
2

我可以看到 Michal 已经回答了您的问题,但您的代码似乎可以更整洁。必须在创建时将 visible 设置为 true 是不必要的额外工作。

我将在您的表中添加一个名为“deleted_at”的日期时间字段,而不是“可见”。然后在你的销毁方法中,你可以这样做:

@guideline.deleted_at = Time.zone.now
@guideline.save!

这还具有存储删除日期/时间的好处,以防以后有用。

您的默认范围可以是:

 default_scope where(deleted_at: nil)
于 2013-03-09T11:27:50.447 回答
0

在您的迁移中,您应该通过在 add_column 方法调用的末尾添加 default: true 来将默认值设置为 true。您还必须将所有现有准则 :visible 设置为 true,以便它们可见。如果您使用默认值,则不必在创建方法中显式设置可见。

如果您想在没有默认 db 值的情况下将 visible 设置为 true,最好在指南模型的 before_create 回调中执行此操作,而不是在控制器中设置它。

于 2013-03-09T14:56:59.440 回答