Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Comments

truongtuongquan.myopenid.com 4
over 3 years ago

Tôi dùng hàm scaffold de tao ra 2 đối tượng là GROUP và USER. GROUP có 2 thuộc tính là id và name. USER 4 các thuộc tính : id, name, group_id, và admin_rule. Trong đó group_id là khoá ngoại đến GROUP, admin_rule là một trong 3 giá trị 1,2,3. Tôi muốn trong màn hình nhập mới của user, sẽ hiện thị các mục nhập là Name (Text Box), Group (Combo Box, refer đến cột Name của GROUP - nhưng lúc lưu xuống DB sẽ lưu id chứ không lưu name) và Admin Rule là Radio Button.

Vấn đề là mặc định trong form new của User ta luôn chỉ có định dạng sau:

<% form_for(@user) do |f| %>

<%= f.text_field :name %>

<% end %>

 

Câu hỏi:

1. Làm sao đưa được select box (refer đến Name colunm của Group) vào form new create của user

2. Làm sao để sử dụng được radio buttin, thay vì dùng tẽt_field

Thanks.

 

ngocdaothanh.myopenid.com 172
over 3 years ago

Về bản chất, những hàm như text_field gọi là những helper. Nghĩa của từ helper: nếu nó không giúp được bạn, thì bạn luôn có thể tự mình giải quyết vấn đề.

Cụ thể hơn, có 2 loại view helper: form helper (ví dụ text_field) và HTML helper (ví dụ text_field_tag), tham khảo API của Rails. Nếu dùng form helper không được thì dùng sang HTML helper, không được nữa thì tự xuất ra chuỗi HTML bạn cần.

akia.myopenid.com 6
over 3 years ago

Bạn thử như sau xem sao nhé:

<%= f.select :group_id, Group.find(:all).collect {|g| [ g.name, g.id ] } %>

<% for value in 1..3 -%>

<%= f.radio_button :admin_rule, value %>

<% end -%>

 

truongtuongquan.myopenid.com 4
over 3 years ago

Cảm ơn bạn nhiều. Nó chạy tốt.

Mình sửa đoạn code cho phần radio button trên thành :

<%= f.radio_button :admin_rule, 1 %> Read Only

<%= f.radio_button :admin_rule, 2 %> Read Write

<%= f.radio_button :admin_rule, 3 %> Read Write Delete

Và bây giờ trong phần user, mình muốn có nhiều admin_rule với cấu trúc giống hệt nhau cho các quyền cụ thể khác nhau  :

-admin_rule1 (ví dụ quyền đối với hoá đơn bán hàng), 

-admin_rule2 (đối với hoá đơn mua hàng),

-admin_rule3(quyền với báo cáo tồn kho),

....  chừng 10 admin_rule

có cách nào tạo ra một vòng lập xuất ra màn hình 10 cái Admin_rule đó không?

nó có cấu trúc giống như dưới được không?

<% for value in 1..10 -%>

<%= f.radio_button :admin_rule_value , 1 %> Read Only

<%= f.radio_button :admin_rule_value , 2 %> Read Write

<%= f.radio_button :admin_rule_value , 3 %> Read Write Delete

<% end -%>

 

 

 

 

 

 

ngocdaothanh.myopenid.com 172
over 3 years ago

Như gợi ý "dùng form helper không được thì dùng sang HTML helper, không được nữa thì tự xuất ra chuỗi HTML", cách luôn luôn hoạt động được là từ trình duyệt chọn "View source" để xem ứng với <%= f.radio_button :admin_rule, 1 %>, HTML xuất ra là gì, rồi  phỏng theo đó để tự xuất ra đoạn HTML cần thiết.

Cách đỡ củ chuối hơn:

<% ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9', 'P10'].each_with_index |p, i| do %>
<%= f.radio_button(:admin_rule_value, i + 1) %> <%= p %>
<% end %>
akia.myopenid.com 6
over 3 years ago
<% for value in 1..10 -%>

<%= f.radio_button :admin_rule_value , 1 %> Read Only

<%= f.radio_button :admin_rule_value , 2 %> Read Write

<%= f.radio_button :admin_rule_value , 3 %> Read Write Delete

<% end -%>

:admin_rule_value sẽ được nhận dạng là 1 symbol nên đoạn chương trình trên của bạn sẽ không hoạt động như mong muốn. Bạn có thể sử dụng eval chẳng hạn:

<% for value in 1..10 -%>

<% rule = eval(":admin_rule_#{value}") -%>

<%= f.radio_button rule, 1 %> Read Only

<%= f.radio_button rule, 2 %> Read Write

<%= f.radio_button rule, 3 %> Read Write Delete

<% end -%>
ndgiang84.myopenid.com 2
over 3 years ago

mình nghĩ nếu có nhiều giá trị của Admin rules thì tạo 1 table "admins" (id, name) đi.

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content