Lưu ý: Bài học này đang ở trạng thái chưa hoàn tất.

Tạo Bài Viết (Create)

Ở bài học trước bạn đã tìm hiểu cách xây dựng một trang gồm biểu mẫu để người dùng có thể tạo bài viết. Bài học này chúng ta sẽ tìm hiểu cách lập trình logic để xử lý action tạo bài viết trên PostsController.

Khi tạo biểu mẫu tạo bài viết mới chúng ta đã đặt giá trị cho thuộc tính action="/posts/create" vì vậy chúng ta cần tạo route cho action này.

Tạo Route

Bạn mở tập tin config/routes.rb và thêm câu lệnh sau (dòng in đậm thứ 2):

  get 'posts/new'
  post 'posts/create'

Câu lệnh quy định các yêu cầu gửi tới server với URL là /posts/create và sử dụng phương thức HTTP là POST sẽ được route tới PostsController và sau đó được xử lý bởi phương thức create().

Phương Thức create

Bước tiếp theo đó là tạo phương thức create() trong PostsController để xử lý logic tạo bài viết trên database. Trong PostsController bạn thêm đoạn câu lệnh sau:

  def create
  end

Dữ Liệu Biểu Mẫu

Bây giờ bạn thêm đoạn mã lệnh sau trong phương thức create() vừa tạo ở trên:

  def create
    render plain: params[:article].inspect
  end

Dòng lệnh ở trên sử dụng hàm render() với đối số truyền vào là một hash (bạn cũng lưu ý trong Ruby khi gọi hàm chúng ta không cần phải sử dụng dấu ngoặc đơn).

plain: params[:post].inspect

Hash trên sử dụng tên khoá là một symbol để quy định kiểu dữ liệu sẽ gửi tới trình duyệt. Ở đây :plain có nghĩa là kiểu dữ liệu sẽ là plain text hay văn bản thuần tuý.

Bạn nhớ lại khi tạo biểu mẫu sử dụng form_for chúng ta đã đặt giá trị cho đối số đầu tiên là post và do đó mã HTML cho các trường trong biểu mẫu có dạng:

<input type="text" name="post[title]" id="post_title" />
<textarea name="post[content]" id="post_content"></textarea>

Trong controller, sử dụng đối tượng params chúng ta có thể truy cập giá trị của các trường trong biểu mẫu. Và với các trường được đặt tên theo dạng mảng như ở trên (post[title]post[content]) thì giá trị của params[:post] sẽ là một hash gồm tên các trường và giá trị tương ứng của từng trường trong biểu mẫu. Bây giờ bạn hãy nhập dữ liệu vào biểu mẫu và sau đó gửi biểu mẫu bạn sẽ thấy kết quả như sau (giá trị của titlecontent sẽ tuỳ thuộc vào giá trị bạn nhập vào biểu mẫu):

{"title"=>"First post!", "content"=>"This is my first post."}

Tạo Bài Viết Trên Database

Ở trên chúng ta sử dụng phương thức render() để hiện thị giá trị các trường của đối tượng params. Bước tiếp theo chúng ta sẽ làm là tạo một bài viết trên cơ sở dữ liệu sử dụng Post model. Bạn xoá đoạn mã mới thêm trong phương thức create ở trên và thay bằng đoạn mã dưới đây:

def create
  @post = Post.new(params.require(:post).permit(:title, :content))

  @post.save
   render plain: @post.inspect
end

Ở trên chúng ta tạo đối tượng @post sử dụng phương thức new trong Post model với đối số truyền vào là một hash chứa dữ liệu của biểu mẫu:

@post = Post.new(@post = Post.new(params.require(:post).permit(:title, :content)))

Bạn thấy chúng ta sử dụng params.require(:post).permit(:title, :content)) thay vì params[:post] như lúc trước. Ruby on Rails muốn đảm bảo tính bảo mật cho ứng dụng khi lưu dữ liệu lên database bằng việc yêu cầu lập trình viên liệt kê đầy đủ các trường muốn lấy từ biểu mẫu để lưu dữ liệu.

Hiện tại với ứng dụng của chúng ta bạn có thể cảm thấy việc này không cần thiết tuy nhiên nếu như trên bảng post chúng ta có một trường là user_id dùng để xác định tác giả bài viết trong trường hợp này chúng ta không muốn cho phép người dùng tự ý đặt giá trị cho trường này.

Tiếp theo chúng ta gọi phương thức save để lưu dữ liệu lên database:

@post.save

Lúc này khi nhập vào dữ liệu và gửi biểu mẫu bạn sẽ thấy kết quả tương tự như sau:

#<Post id: 1, title: "First post", content:"This is my first post", created_at: "2016-05-18 05:24:26", updated_at: "2016-05-18 05:24:26">

Khi kiểm tra trên cơ sở dữ liệu bạn sẽ thấy một record mới được tạo ra trong bảng posts. Sử dụng SQLite3 client để kiểm tra bạn sẽ thấy kết quả như sau:

sqlite> select * from posts;
id          title       content         created_at                  updated_at                
----------  ----------  --------------  --------------------------  --------------------------
1           First post  Sample content  2016-05-18 05:38:06.573532  2016-05-18 05:38:06.573532

Thêm Bình Luận