2013-06-12 19 views
7

Tôi có đối tượng biểu mẫu sau để quản lý biểu mẫu lồng nhau phức tạp.Tôi nên xử lý thao tác chỉnh sửa và cập nhật khi sử dụng Đối tượng mẫu như thế nào?

Mẫu

= simple_form_for(@profile_form, :url => profiles_path) do |f| 
    ... 

đường

resources :profiles 

khiển

class ProfilesController < ApplicationController 
    def new 
    @profile_form = ProfileForm.new 
    end 

    def edit 
    @profile_form = ProfileForm.new(params[:id]) 
    end 

    def create 
    @profile_form = ProfileForm.new 
    if @profile_form.submit(params[:profile_form]) 
     redirect_to @profile_form.profile, notice: 'Profile was successfully created.' 
    else 
     render action: "new" 
    end 
    end 

    def update 
    @profile_form = ProfileForm.new(params[:id]) 
    if @profile_form.submit(params[:profile_form]) 
     redirect_to @profile_form.profile, notice: 'Profile was successfully updated.' 
    else 
     render action: "edit" 
    end 
    end 
end 

Đối tượng biểu mẫu

class ProfileForm 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    def initialize(profile_id = nil) 
    if profile_id 
     @profile = Profile.find(profile_id) 
     @person = profile.person 
    end 
    end 
    ... 
    def submit(params) 
    profile.attributes = params.slice(:available_at) 
    person.attributes = params.slice(:first_name, :last_name) 

    if valid? 
     profile.save! 
     person.save! 
     true 
    else 
     false 
    end 
    end 
    def self.model_name 
    ActiveModel::Name.new(self, nil, "Profile") 
    end 

    def persisted? 
    false 
    end 
end 

Nhưng ngay bây giờ khi tôi đang chỉnh sửa đối tượng sử dụng mẫu đơn này create hành động được gọi. Sau đó tôi nên cấu trúc lại biểu mẫu này như thế nào? Mã bên dưới trên update tạo một đối tượng Cấu hình khác.

Trả lời

6

simple_form_for sử dụng form_for nội bộ để thực hiện công việc của mình. form_for sử dụng phương pháp persisted? để quyết định xem đối tượng đã tồn tại trên cơ sở dữ liệu hay chưa. Nếu nó đã được lưu giữ form_for sẽ tạo một biểu mẫu với phương thức PUT để cập nhật đối tượng, nếu không nó sẽ tạo biểu mẫu với phương thức POST để tạo đối tượng mới. Do đó bạn phải triển khai phương thức persisted? cho đối tượng biểu mẫu của bạn. Bạn có thể thực hiện nó như thế này:

class ProfileForm 
    # ... 
    def persisted? 
    @person.persisted? && @profile.persisted? 
    end 
    # ... 
end 

Cập nhật Trong trường hợp @personnil, ví dụ: không có Person liên quan đến Profile, tôi giả sử bạn sẽ tạo ra một mới Person liên kết đến @profile. Trong trường hợp này nó là an toàn để giả định rằng một ProfileFormpersisted? miễn là ít nhất là @profilepersisted?, như sau:

class ProfileForm 
    # ... 
    def persisted? 
    @profile.persisted? 
    end 
    # ... 
end 

Cập nhật Để tránh lỗi này undefined local variable or method `id' bạn phải xác định phương pháp id cho ProfileForm, như thế này:

class ProfileForm 
    # ... 
    def id 
    @profile.id 
    end 
    # ... 
end 
+0

Ok, giờ tôi đã hiểu, cảm ơn. Nhưng làm thế nào để thay đổi url mẫu sau đó: '' = simple_form_for (@profile_form,: url => profiles_path) do | f | '' Và tôi nhận được lỗi: '' undefined local variable hoặc method 'id 'cho # '' – tomekfranek

+0

Và nếu @person là nil thì sao? – tomekfranek

+0

Tôi vẫn còn lỗi tương tự sau khi thêm phương thức '' to_param''. Có vẻ như vấn đề là với url. – tomekfranek

0
replace 

    = simple_form_for(@profile_form, :url => profiles_path) do |f| 

    with 

    = simple_form_for(@profile_form, :url => {:controller => "profiles"}) do |f| 
+1

Không, không có gì thay đổi. url của biểu mẫu vẫn là: action: ''/profiles'' method: '' post'' – tomekfranek