2009-01-08 36 views
6

Tôi đang làm việc trên ứng dụng Rails gửi dữ liệu thông qua biểu mẫu. Tôi muốn sửa đổi một số "thông số" của biểu mẫu sau khi biểu mẫu gửi đi, nhưng trước khi nó được xử lý.Đường ray: sửa đổi thông số biểu mẫu trước khi sửa đổi cơ sở dữ liệu

Những gì tôi có ngay bây giờ

{"commit"=>"Create", 
    "authenticity_token"=>"0000000000000000000000000" 
    "page"=>{ 
    "body"=>"TEST", 
    "link_attributes"=>[ 
     {"action"=>"Foo"}, 
     {"action"=>"Bar"}, 
     {"action"=>"Test"}, 
     {"action"=>"Blah"} 
    ] 
    } 
} 

Những gì tôi muốn

{"commit"=>"Create", 
    "authenticity_token"=>"0000000000000000000000000" 
    "page"=>{ 
    "body"=>"TEST", 
    "link_attributes"=>[ 
     {"action"=>"Foo", 
     "source_id"=>1}, 
     {"action"=>"Bar", 
     "source_id"=>1}, 
     {"action"=>"Test", 
     "source_id"=>1}, 
     {"action"=>"Blah", 
     "source_id"=>1}, 
    ] 
    } 
} 

Đây có phải là khả thi? Về cơ bản, tôi đang cố gắng gửi hai loại dữ liệu cùng một lúc ("trang" và "liên kết") và gán "source_id" của "liên kết" cho "id" của "trang".

Trả lời

15

Trước khi được gửi tới cơ sở dữ liệu, bạn có thể viết mã trong bộ điều khiển sẽ lấy thông số và nối thêm thông tin khác trước khi lưu. Ví dụ:

FooController < ApplicationController 

    def update 
    params[:page] ||= {} 
    params[:page][:link_attributes] ||= [] 
    params[:page][:link_attriubtes].each { |h| h[:source_id] ||= '1' } 
    Page.create(params[:page]) 
    end 

end 
+0

Bất cứ điều gì cụ thể hơn? –

+0

Tôi không thể bỏ phiếu lên ví dụ của Gaius .. nhưng yeah, rằng –

+0

Không, nhưng kỳ quặc tôi có thể upvote câu trả lời của bạn mà tôi đã chỉnh sửa. –

2

Bạn cũng nên xem xét gọi lại, cụ thể before_validate (nếu bạn đang sử dụng xác thực), before_save hoặc before_create.

Thật khó để cung cấp cho bạn một ví dụ cụ thể về cách sử dụng chúng mà không biết cách bạn đang lưu dữ liệu, nhưng nó có thể trông rất giống với ví dụ mà Gaius đưa ra.

2

Sửa params trước khi sử dụng params mạnh

Ok, vậy (phục hồi câu hỏi cũ này) Tôi đã có rất nhiều rắc rối với điều này, tôi muốn sửa đổi một param trước khi nó đạt đến mô hình (và giữ params mạnh) . Cuối cùng tôi đã tìm ra, đây là những điều cơ bản:

def update 
    sanitize_my_stuff 
    @my_thing.update(my_things_params) 
end 

private 

def sanitize_my_stuff 
    params[:my_thing][:my_nested_attributes][:foo] = "hello" 
end 

def my_things_params 
    params.permit(etc etc) 
end 
Các vấn đề liên quan