1

ガイドラインを削除するのではなく、非表示としてマークを付けたいのです(したがって、ガイドラインはまだデータベースにありますが、ユーザーには表示されません)。これにはいくつかの大きな問題があります

  1. ビューからガイドラインを削除できないようです
  2. 管理者側を表示しようとすると、ガイドラインでエラーが発生します

ActionView :: Template :: Error(#の未定義のメソッド `comment_ids_contains'):

2番は無関係だと思いますが、以下の変更を行う前は問題は発生しませんでした。私のguidelines.rbモデルに追加しました

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

guideline_controller.rbで、destroyおよびcreateアクションをに変更しました

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

そして私はdb移行を追加しました

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

3 に答える 3

2

まず、次のことを行います。

@guideline.visible=false

Ruby オブジェクトを変更するだけなので十分ではありません。save!変更を DB に反映するには、次のように呼び出す必要があります。

@guideline.visible = false
@guideline.save!

を使用update_attributeして、1 つのステップで実行することもできます。

@guideline.update_attribute(:visible, false)

ただし、このメソッドはいくつかのステップ (検証など) をスキップするため、最初にそれについて読んだほうがよいでしょう。

もう 1 つのことは、他のユーザーが互いのガイドラインを削除することを望まない限り、おそらく次のコードを使用してガイドラインを見つける必要があるということです。

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

あなたの質問はすでに Michal によって回答されていることがわかりますが、あなたのコードはもっと整頓されているようです。作成時に visible を true に設定する必要はありませんが、必要のない余分な作業です。

「可視」の代わりに、「deleted_at」という日時フィールドをテーブルに追加します。次に、destroy メソッドで、次のことを行うことができます。

@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 に設定して、それらが表示されるようにする必要があります。デフォルトを使用する場合、create メソッドで明示的に visible を設定する必要はありません。

デフォルトの db 値なしで visible を true に設定する場合は、コントローラーで設定するよりも、ガイドライン モデルの before_create コールバックで設定する方が適切です。

于 2013-03-09T14:56:59.440 に答える