添加is_visible而不是destroy

时间:2013-03-09 10:06:38

标签: ruby-on-rails ruby-on-rails-3

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

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

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

    我怀疑没有2是不相关的,但在我做出以下更改之前没有给我带来任何问题。 在我的guidelines.rb模型中,我添加了

    default_scope where(:visible => true)
    attr_accessible :visible
    
    在guideline_controller.rb中

    我将destroy和create actions更改为

    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
    

3 个答案:

答案 0 :(得分:2)

首先,做:

@guideline.visible=false

是不够的,因为你只是在改变Ruby对象。您必须调用save!将更改传播回DB:

@guideline.visible = false
@guideline.save!

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

@guideline.update_attribute(:visible, false)

虽然此方法会跳过某些步骤(例如验证),但首先要更好read about it

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

current_user.guidelines.find(params[:id])

答案 1 :(得分:2)

我可以看到你的问题已经被Michal回答了,但看起来你的代码可能比较整洁。必须在创建时将visible设置为true,这是不需要的额外工作。

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

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

这也有利于存储删除日期/时间以防以后有用。

您的默认范围可以是:

 default_scope where(deleted_at: nil)

答案 2 :(得分:0)

在迁移中,应通过在add_column方法调用结束时添加default:true来将默认值设置为true。您还必须设置所有现有指南:可见为true,以便它们可见。如果使用默认值,则不必在create方法中明确设置visible。

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