2012-08-16 46 views
9

Tôi có một mô hình theo toa trong ứng dụng Rails 3 của mình. Tôi đang cố gắng tìm ra phương pháp tốt nhất để cho phép sao chép các bản ghi, nhưng cho phép người dùng "xem lại" bản sao trước khi nó được lưu.Sao chép bản ghi trong Rails 3

Tôi đã đọc một số câu hỏi/câu trả lời trên SO (chẳng hạn như this) giải thích cách sao chép/sao chép bản ghi rồi lưu - nhưng không có cách nào giải thích cách hiển thị biểu mẫu trước khi lưu.

Đọc API Rails xuất hiện là phương pháp clone khả dụng.

Reading other questions và câu trả lời cho thấy là có thể được thực hiện nhưng không có mã ví dụ ngoài:

new_record = old_record.dup 

Mã điều khiển Tôi hiện đang làm việc với là như sau (mô hình không có bất kỳ mối quan hệ):

# 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 

tôi sẽ được liên kết đến hành động này clone từ vùng đang xem với:

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

Có đơn giản như việc thêm một hành động vào bộ điều khiển của tôi như thế này không?

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

Xin lỗi nếu mã trên hoàn toàn sai, tôi đang cố gắng tìm hiểu! Tôi đã thấy someone làm chính xác những gì tôi đang cố gắng để đạt được với nhân bản - nhưng không phải với chỉnh sửa trước khi lưu.

Người dùng đang sao chép sẽ không có quyền chỉnh sửa bản ghi khi được lưu. Đó là hoàn toàn cho các mục nhập dữ liệu intial.

Trả lời

7

Nếu bạn muốn tác vụ sao chép cho phép người dùng xem lại bản sao trước khi được lưu (AKA được tạo), thì nó gần giống như hành động "mới", ngoại trừ trường đã điền.

Vì vậy, phương pháp clone của bạn có thể là một biến thể của phương pháp mới của bạn:

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 

Trong giao diện, sau đó họ có thể tạo ra các đối tượng.

5

Để thực hiện việc này, bạn sẽ phải tạo một phiên bản mới của lớp Prescription của bạn. "dup" hoạt động, nhưng bạn giả sử nó ghi đè lên bản ghi hiện có. Chỉ có phương pháp kết thúc bằng một tiếng nổ (!) Có xu hướng làm điều đó.

Mã của bạn nên là:

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

hoặc

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

này không được thử nghiệm cho lần khi: id là không tìm thấy.

+0

Tôi nghĩ rằng Rails đặt id thành nil khi sử dụng 'dup' trên mô hình, xử lý nó như mới. Xem http://apidock.com/rails/ActiveRecord/Core/dup –

0

Tôi đang tìm kiếm logic để sao chép bản ghi hiện có. Tôi đã phải sửa đổi logic được đăng bởi ronalchn một chút bởi vì khi nó cố gắng thực hiện câu lệnh thứ hai của bản sao tôi nhận được một lỗi gán hàng loạt vì nó đã cố gắng sao chép id, created_at, updated_at không có trong danh sách attr_accessible của tôi.Đây là cách tôi sửa đổi logic để làm cho nó hoạt động trong ứng dụng của tôi bằng cách sử dụng mô hình của tôi:

@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 
Các vấn đề liên quan