10

Rails 3 アプリケーションに処方箋モデルがあります。レコードの複製を許可する最善の方法を見つけようとしていますが、保存する前にユーザーが複製を「確認」できるようにしています。

レコードを複製/複製して保存する方法を説明するSO に関するいくつかの質問/回答 (このようなもの) を読みましたが保存する前にフォームを表示する方法を説明するものはありません。

Rails API を読むとcloneメソッドが使えるようです。

他の質問と回答を読むと、それが可能であることが示されますが、次のもの以外にサンプルコードはありません。

new_record = old_record.dup

私が現在取り組んでいるコントローラー コードは次のとおりです (モデルには関係がありません)。

  # POST /prescriptions
  # POST /prescriptions.json
  def create
    @prescription = Prescription.new(params[:prescription])
    @prescription.localip = request.env['REMOTE_ADDR']
    @prescription.employee = @prescription.employee.upcase

    respond_to do |format|
      if @prescription.save
        format.html { redirect_to @prescription, notice: 'Prescription was successfully created.' }
        format.json { render json: @prescription, status: :created, location: @prescription }
      else
        format.html { render action: "new" }
        format.json { render json: @prescription.errors, status: :unprocessable_entity }
      end
    end
  end

ビューからこのクローン アクションにリンクします。

<%= link_to "Create another like this?", clone_prescription_url(@prescription), :method => :put %>

このようにコントローラーにアクションを追加するのと同じくらい簡単ですか?

def clone
 @prescription = Prescription.find(params[:id])
 @prescription.dup
 @prescription.save
end

上記のコードが完全に間違っている場合は申し訳ありません。私はそれを回避しようとしています! 私がクローン作成で達成しようとしていることを誰かが正確に実行しているのを見たことがありますが、保存前の編集ではそうではありません。

複製しているユーザーには、保存されたレコードを編集する権限がありません。純粋に最初のデータ入力用です。

4

3 に答える 3

8

これを行うには、Prescription クラスの新しいインスタンスを作成する必要があります。「dup」は機能しますが、既存のレコードを上書きすると想定しています。bang(!) で終わるメソッドだけがそうする傾向があります。

コードは次のようになります。

def clone
 @prescription = Prescription.find(params[:id])
 @new_prescription = @prescription.dup
 @new_prescription.save
end

また

def clone
 @prescription = Prescription.find(params[:id]).dup
 @prescription.save
end

これは、:id が見つからない場合のテストではありません。

于 2012-08-17T07:55:50.093 に答える
7

複製アクションで、ユーザーが複製を保存する前に確認できるようにしたい場合 (AKA 作成済み)、フィールドが既に入力されていることを除いて、「新規」アクションとほとんど同じです。

したがって、クローン メソッドは、新しいメソッドの変更である可能性があります。

def new
  @prescription = Prescription.new()
end
def clone
  @prescription = Prescription.find(params[:id]) # find original object
  @prescription = Prescription.new(@prescription.attributes) # initialize duplicate (not saved)
  render :new # render same view as "new", but with @prescription attributes already filled in
end

その後、ビューでオブジェクトを作成できます。

于 2012-08-17T07:57:20.227 に答える
0

既存のレコードを複製するロジックを探していました。ronalchn によって投稿されたロジックを少し変更する必要がありました。これは、クローンの 2 番目のステートメントを実行しようとしたときに、attr_accessible リストに含まれていない id、created_at、updated_at をコピーしようとしたため、大量割り当てエラーが発生したためです。これは、モデルを使用してアプリケーションで動作するようにロジックを変更した方法です。

@old_event = Event.find(params[:id]) # find original object
@event = Event.new
@event.field_1 = @old_event.field_1 (statement for each field in attar_accessible)
render :new # render same view as "new", but with @prescription attributes already filled in
于 2013-05-27T13:14:22.300 に答える