Article:
Xử lí form trong Rails
1154
ngocdaothanh.myopenid.com 172Over 3 years ago |

Về bản chất, trang web cũng chỉ là hệ thống bình thường có đầu vào và đầu ra: vào -> hệ thống -> ra. Để người dùng nhập dữ liệu vào hệ thống, form là cách chuẩn và thường dùng nhất.
Phần đầu bài viết này trình bày lí thuyết về form, đúng cho mọi framework của mọi ngôn ngữ (Java, PHP, Ruby...), phần sau trình bày cách Rails xử lí form và các hàm tiện ích. Bài viết này chỉ tổng kết lại kiến thức, để hiểu bạn cần học qua Rails.
Lí thuyết về form
Chuẩn HTML định nghĩa một số control như text field, text area để người dùng nhập rồi gửi dữ liệu từ trình duyệt đến server. Tham khảo Wikipedia, W3Schools, W3.
Từ trình duyệt chọn view source của những trang web cho phép nhập dữ liệu, sẽ thấy form có dạng sau:
<form action="URL_của_action_sẽ_xủ_lí_form" method="POST">
tên_tham_số - giá_trị
tên_tham_số - giá_trị
tên_tham_số - giá_trị
nút_submit
</form>
Khi ấn nút submit, form sẽ được gửi lên server đến action được chỉ định để được xử lí.
Cách Rails xử lí form
Lại cũng từ trình duyệt chọn view source form của chương trình Rails, để ý sẽ thấy có 2 loại form:
- Form có tham số ứng với model trong cơ sở dữ liệu: tham số có dạng tên_model[tên_thuộc_tính].
- Form không có tham số ứng với model trong cơ sở dữ liệu: tham số không nhất thiết phải có dạng như trên, bạn có thể đặt tuỳ ý.
Trong action để biết giá trị của tham số là gì, hãy kiểm tra giá trị của hash params, ví dụ: params[:tên_tham_số].
Hàm tiện ích
Mặc dù trong view luôn có thể viết form thủ công như lí thuyết đã nêu, sao cho đoạn HTML xuất ra có dạng theo qui định của Rails như trên, thường người ta dùng hàm tiện ích (helper) do Rails cung cấp. Hàm tiện ích chia là 4 loại:
- Form helper: ứng với form có tham số ứng với model trong cơ sở dữ liệu, xem API của module FormHelper.
- Form tag helper: ứng với form không có tham số ứng với model trong cơ sở dữ liệu, xem API của module FormTagHelper.
- Form options helper: để tạo select, xem API của module FormOptionsHelper và DateHelper.
- Ajax form: tạo/truyền form bằng Ajax, xem PrototypeHelper.
Câu hỏi thường gặp
Q: Giả sử cho phép nhập HTML. Khi hiển thị sẽ hiển thị chuỗi HTML người dùng đã nhập, làm thế nào để chống hacker?
A: Dùng SantinizeHelper có sẵn trong Rails hoặc plugin white_list.
Q: Chuỗi kí tự người dùng nhập có thể chứa khoảng trắng ở đầu và cuối. Làm thế nào để loại bỏ trước khi validate?
A: Dùng plugin StripAttributes hoặc thêm đoạn mã sau vào environment.rb
class ActiveRecord::Base
before_validation :strip_white_space
private
def strip_white_space
self.attributes.each do |key, value|
self[key].strip! if self[key].class == String and !self[key].nil?
end
end
end
Q: Tôi muốn làm form để người dùng nhập câu trả lời cho thăm dò dư luận (poll). Làm thế nào để số lượng câu trả lời có thể thay đổi tuỳ ý?
A: Dùng mảng (array). Để truyền mảng đến server, tên của tham số mảng phải tận cùng bằng dấu ngoặc vuông, ví dụ ở dưới cho phép nhập 3 câu trả lời. Để người dùng có thể thêm bớt câu trả lời, dùng JavaScript để thêm bớt input vào form (thêm bớt phần tử vào cây DOM).
<form ... >
...
<input type="text" name="poll[responses][]" />
<input type="text" name="poll[responses][]" />
<input type="text" name="poll[responses][]" />
...
</form ... >
Trên server, params[:poll][:responses] sẽ là mảng chứa các câu trả lời.
Bạn nào có câu hỏi gì, xin ghi vào phần bình luận ở dưới. Hoặc nếu nhớ ra vấn đề thường gặp và cách giải quyết, xin tự do sửa bài viết này để bổ sung.
172