2016-04-04 11 views
7

Người dùng có thể nhập vào một tùy chỉnh :action hoặc chọn một đặc trưng :action:Cách chuẩn bị _form cho các đối tượng nổi bật?

<%= f.text_field :action %> 
    Or choose a featured challenge: 
<%= f.collection_radio_buttons :action, [['Run a Mile','Run a Mile'], ['Drink 16oz of Water','Drink 16oz of Water'], ['Take a Picture','Take a Picture'], ['1 Drink Max','1 Drink Max'], ['See Eiffel Tower','See Eiffel Tower'], ['Write a Book','Write a Book'], ['Skydive','Skydive'], ['Start a Business','Start a Business'], ['No Snooze','No Snooze'], ['Visit All 50 States','Visit All 50 States'], ['Talk to a Stranger','Talk to a Stranger'], ['Try a New Recipe','Try a New Recipe'], ['Media-fast','Media-fast']], :first, :last %> 

Nếu người dùng chọn một đặc trưng :action những thách thức mới/_form được điền sẵn với lựa chọn của mình :action, nhưng bây giờ tôi muốn mang nó đến cấp độ tiếp theo với sự giúp đỡ của bạn!

<%= form_for(@challenge) do |f| %> 
    Challenge: <%= f.text_field :action %> 
    Do On: <%= f.collection_check_boxes :committed %> 
    Do For: <%= f.number_field :days_challenged %> 
<% end %> 

Làm cách nào để có thể điền trước các thuộc tính khác của thử thách nổi bật như "Do For" hoặc "Do On"?

Ví dụ nếu người dùng đã chọn đặc trưng :action: 'Run a Mile sau đó tôi sẽ điền trước các mẫu với Run a Mile, Mon, Wed, Fri, 30 Days.

+0

Bạn có thể khởi tạo thể hiện 'Challenge' với các giá trị, như' @challenge = Challenge.new (days_challenged: 12) ', và sau đó trong biểu mẫu của bạn, bạn sẽ thấy' 12' làm giá trị được điền trước cho 'days_challenged' – MrYoshiji

+0

Xin chào @MrYoshiji, nhưng hãy nói rằng tôi có 100 thử thách nổi bật. Làm thế nào tôi có thể có một giá trị điền sẵn riêng biệt cho mỗi một? –

+0

Làm điều đó trong javascript một tùy chọn? – Shishir

Trả lời

2

Bạn có thể sử dụng simple_form với reform. Cải cách sẽ cung cấp cho bạn đối tượng biểu mẫu, nơi bạn có thể ghi đè lên các phương thức sẽ điền vào biểu mẫu của bạn.

Dưới đây là một ví dụ tưới xuống (bạn sẽ phải điều chỉnh nó cho trường hợp của bạn):

class ChallengeForm < Reform::Form 
    property :action 
    property :committed 
    property :days_challenged 

    model :challenge 

    def commited 
    super || action_to_commited_hash[model.action] 
    end 

    def days_challenged 
    super || action_to_days_challenged_hash[model.action] 
    end 

    def action_to_days_challenged_hash 
    { 
     'Run a Mile' => 30, 
     'Take a Picture' => 12 
    } 
    end 

    def action_to_commited_hash 
    { 
     'Run a Mile' => ['Mon', 'Wed', 'Fri'], 
     'Take a Picture' => ['Tu', 'Thu'] 
    } 
    end 
end 

super trong các phương pháp trên sẽ uỷ thác cho model. Lưu ý rằng bạn đang ghi đè getter phương pháp và không ảnh hưởng đến setters (bạn cũng có thể ghi đè các bộ định vị nếu bạn muốn thay đổi dữ liệu biểu mẫu trước khi ghi).

Trong mẫu của bạn, thay vì

form_for @challenge 

bạn sẽ có:

simple_form_for @form 

Đó là một hình thức thư viện siêu phổ biến đối với Rails và tôi không thể tưởng tượng không sử dụng nó bản thân mình!

+0

Xin chào, vì vậy tôi đã tạo một ứng dụng thư mục/biểu mẫu sau đó tôi đã tạo 'challenge_form.rb' với mã của bạn trong đó. Tôi đã chuyển biểu mẫu khác sang 'simple_form_for @ form'. Điều này có đúng không? Tôi không thể làm cho nó hoạt động từ đó, không phải 'action_to_days_challenged_hash' hoặc' action_to_commited_hash' đang được đặt ở dạng phụ. Chỉ có 'action' vẫn đặt –

+0

HTML Output:' Do For: 'Tôi không nếu đó là hữu ích. –

+0

Dường như đúng. Bạn có chuyển mô hình đến dạng như mô tả trong readme cải cách không? https://github.com/apotonick/reform (Xin lỗi, tôi nên có quy định rằng tôi thực sự nói về 'simple_form' +' reform' usage) - cập nhật câu trả lời của tôi. –

Các vấn đề liên quan