views:

720

answers:

2

Hi,

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  A: 

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

Kri-ban
Ooh, very close! I didn't think it would matter in the original question, but these are options for a file that the user is uploading at the same time. see my updated question, I don't have enough room here for the rest of the scheme
mmr
I don't think this second specification is *very close* to the original.I find it frustrating when you change the problem completely after I've given the original answer.Go try oDesk.com
Kri-ban
Well, using your answer, I was able to get it working, so it is, in fact, "very close". Thanks for your help, sorry you got annoyed.
mmr
I misinterpreted your second version. I thought the file should contain the alternatives. Sorry for my reaction.You can do without the second form, by undenting the "file" button so it's not part of the loop.
Kri-ban
A: 

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)
Kri-ban