问题
I have an array of strings, called @theModels, in a routine implemented as part of a Sinatra server. These models are options for the user to select, and are obtained by the back end (the idea being, as new models are added, then the front end code should not change).
I'm using haml to render html.
How can I enumerate each element in the list of @theModels such that each element is a checkbox? And how can I obtain which checkboxes the user has selected?
I see that just putting
= @theModels
will give me the list of strings contained in @theModels, but without spacing or the like, and certainly not in checkboxes. I've found this question that appears to be similar, but my haml-fu isn't good enough to convert that into what I need.
UPDATE:
These are options associated with a file upload, such that now the code looks like:
%form{:action=>"/Upload",:method=>"post",:enctype=>"multipart/form-data"}
- @theModelHash.each do |key,value|
%br
%input{:type=>"checkbox", :name=>"#{key}", :value=>1, :checked=>value}
=key
%input{:type=>"file",:name=>"file"}
%input{:type=>"submit",:value=>"Upload"}
Problem is, that puts a file upload button on each option, instead of at the end. I only want one submit button in the end; should I have two forms that both report their results when the 'Upload' button is pressed?
UPDATE2:
After a moment's thought, the above can be modified to:
Thanks!
%form{:action=>"/Upload",:method=>"post",:enctype=>"multipart/form-data"}
- @theModelHash.each do |key,value|
%br
%input{:type=>"checkbox", :name=>"#{key}", :value=>1, :checked=>value}
=key
%form{:action=>"/Upload",:method=>"post",:enctype=>"multipart/form-data"}
%input{:type=>"file",:name=>"file"}
%input{:type=>"submit",:value=>"Upload"}
And that appears to do what I want.
回答1:
I think you should send the content as an hash instead. This will give you the opportunity to set initial values in the form.
The hash @params will give you the result.
E.g. {"oranges"=>"1"}
#app.haml %form{:method => 'post', :action => "/"} - @models.each do |key,value| %br %input{:type=>"checkbox", :name=>"#{key}", :value=>1, :checked=>value} =key %input{:type => :submit, :value => "Save"} #app.rb require 'sinatra' require 'haml' get '/' do @models = {"oranges" => true, "bananas" => false} haml :app end post '/' do @params.inspect end
回答2:
The link you provided linked to a rails solution where you have a function returning the proper html.
You can define this function yourself:
Input: key, value Output: %input{:type=>"checkbox", :name=>"#{key}", :value=>1, :checked=>value} def check_box(key, value) ... end and call it in haml with =check_box(key,value)
来源:https://stackoverflow.com/questions/2129387/how-do-i-get-an-array-of-check-boxes-in-haml