而不是删除指南,我希望它被标记为不可见(因此它仍然在我的数据库中,但用户不会看到它列出)。这有几个主要问题
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
答案 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回调中进行,而不是在控制器中设置它。