I have some trouble solving a problem.
I''m trying to make a musician community, where you''ll be able
to find
other musicians. The users will have to choose which kind of music style
they prefer, and which instruments they play. They should be able to
choose more than one style and instrument, so i think ill use check
boxes, but theres my problem how? I''ve tries check_box and
check_box_tag, but i dont really know how to use them. I have values for
the check boxes in VALID_STYLES, and would like to use some kind of
loop, so i dont have to repeat code. another problem is that I can get
one checkbox to work but not 2 or more, when i select multible
checkboxes only the value of the first gets stored in the DB
Model:
[code=]class Spec < ActiveRecord::Base
belongs_to :user
VALID_GENDERS = ["Mand", "Kvinde"]
VALID_AREAS = ["","København", "Storkøbenhavn",
"Århus", "Aalborg",
"Odense",
"Nordsjælland", "Vestsjælland",
"Sydsjælland",
"Midtsjælland",
"Lolland/Falster", "Fyn",
"Nordjylland", "Østjylland",
"Vestjylland", "Midtjylland",
"Sønderjylland",
"Bornholm",
"Andet" ]
VALID_STYLES = ["Rock", "Pop", "Elektronisk",
"Hip-Hop", "R&B og
Soul",
"Metal", "Blues", "Jazz",
"Verdensmusik",
"Country",
"Folkemusik", "Klassisk"]
START_YEAR = 1900
VALID_DATES = DateTime.new(START_YEAR)..DateTime.now
ZIP_CODE_LENGTH = 4
validates_inclusion_of :gender,
:in => VALID_GENDERS,
:allow_nil => true,
:message => "skal være mand eller kvinde"
validates_inclusion_of :birthdate,
:in => VALID_DATES,
:allow_nil => true,
:message => "er ugyldig"
validates_inclusion_of :area,
:in => VALID_AREAS,
:allow_nil => true,
:message => "skal ikke være opdigtet"
validates_format_of :zip_code, :with =>
/(^$|^[0-9]{#{ZIP_CODE_LENGTH}}$)/,
:message => "skal være på 4 tegn"
end[/code]
Controller:
[code=]def edit
@title = "Opdater info"
@user = User.find(session[:user_id])
@user.spec ||= Spec.new
@spec = @user.spec
if param_posted?(:spec)
if @user.spec.update_attributes(params[:spec])
flash[:notice] = "Ændringer gemt"
redirect_to :controller => "user", :action =>
"index"
end
end
end[/code]
View:
[code=]<% form_for :spec do |form| %>
<fieldset>
<legend><%= @title %></legend>
<%= error_messages_for ''spec'' %>
<div class="form_row">
<label for="gender">Gender:</label>
<%= radio_button :spec, :gender, "Mand" %> mand
<%= radio_button :spec, :gender, "Kvinde" %> kvinde
</div>
<div class="form_row">
<label for="birthdate">Birthdate:</label>
<%= date_select :spec, :birthdate,
:start_year => Spec::START_YEAR,
:end_year => Time.now.year,
:include_blank => true,
:order => [:day, :month, :year] %>
</div>
<div class="form_row">
<label for="area">Area:</label>
<%= select(:spec, :area, Spec::VALID_AREAS) %>
</div>
<div class="form_row">
<label for="music_style">Musik style:</label>
<%= check_box(:spec, :music_style, {}, "Rock", nil) %> Rock
</div>
<%= text_field_for form, "zip_code", Spec::ZIP_CODE_LENGTH %>
<%= submit_tag "Update", :class => "submit" %>
</fieldset>
<% end %>[/code]
Migrate:
[code=]class CreateSpecs < ActiveRecord::Migration
def self.up
create_table :specs do |t|
t.column :user_id, :integer, :null => false
t.column :gender, :string
t.column :birthdate, :date
t.column :area, :string, :default => ""
t.column :zip_code, :string, :default => ""
t.column :music_style, :mediumtext, :default => ""
# t.column :music_instruments, :mediumtext, :default => ""
# t.column :looking_for, :mediumtext, :default => ""
end
end
def self.down
drop_table :specs
end
end[/code]
Please help a noob
Regards Benjamin
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
That''s because check_box is a boolean entry (or value) control. You
would probably need to use check_box_tag.
Here, you need to loop in the view. Notice that only the checked styles
will be sent to the controller.
<% Spec::VALID_STYLES.each do |style| %>
<%= check_box_style ''valid_style[]'', style %>
<% end %>
Then in the update, or create, you will have a parameter style array
with "style"=>["Pop", "Elektronisk",
"Hip-Hop", "R&B og Soul"]
You can then set the style from this array by converting it to string.
ie style = params[:style]
style.select {|s| spec.music_style += s }
or something similar
hope this helps.
Serge Chevarie-Pelletier
Benjamin Jørgensen wrote:> I have some trouble solving a problem.
>
> I''m trying to make a musician community, where you''ll be
able to find
> other musicians. The users will have to choose which kind of music style
> they prefer, and which instruments they play. They should be able to
> choose more than one style and instrument, so i think ill use check
> boxes, but theres my problem how? I''ve tries check_box and
> check_box_tag, but i dont really know how to use them. I have values for
> the check boxes in VALID_STYLES, and would like to use some kind of
> loop, so i dont have to repeat code. another problem is that I can get
> one checkbox to work but not 2 or more, when i select multible
> checkboxes only the value of the first gets stored in the DB
>
>
>
>
> Model:
> [code=]class Spec < ActiveRecord::Base
> belongs_to :user
>
> VALID_GENDERS = ["Mand", "Kvinde"]
>
> VALID_AREAS = ["","København",
"Storkøbenhavn", "Århus", "Aalborg",
> "Odense",
> "Nordsjælland", "Vestsjælland",
"Sydsjælland",
> "Midtsjælland",
> "Lolland/Falster", "Fyn",
"Nordjylland", "Østjylland",
> "Vestjylland", "Midtjylland",
"Sønderjylland",
> "Bornholm",
> "Andet" ]
>
> VALID_STYLES = ["Rock", "Pop",
"Elektronisk", "Hip-Hop", "R&B og
> Soul",
> "Metal", "Blues",
"Jazz", "Verdensmusik",
> "Country",
> "Folkemusik", "Klassisk"]
>
> START_YEAR = 1900
> VALID_DATES = DateTime.new(START_YEAR)..DateTime.now
> ZIP_CODE_LENGTH = 4
>
> validates_inclusion_of :gender,
> :in => VALID_GENDERS,
> :allow_nil => true,
> :message => "skal være mand eller
kvinde"
>
> validates_inclusion_of :birthdate,
> :in => VALID_DATES,
> :allow_nil => true,
> :message => "er ugyldig"
>
> validates_inclusion_of :area,
> :in => VALID_AREAS,
> :allow_nil => true,
> :message => "skal ikke være opdigtet"
>
>
>
> validates_format_of :zip_code, :with =>
> /(^$|^[0-9]{#{ZIP_CODE_LENGTH}}$)/,
> :message => "skal være på 4 tegn"
>
>
> end[/code]
> Controller:
> [code=]def edit
> @title = "Opdater info"
> @user = User.find(session[:user_id])
> @user.spec ||= Spec.new
> @spec = @user.spec
> if param_posted?(:spec)
> if @user.spec.update_attributes(params[:spec])
> flash[:notice] = "Ændringer gemt"
> redirect_to :controller => "user", :action =>
"index"
> end
> end
>
> end[/code]
> View:
> [code=]<% form_for :spec do |form| %>
> <fieldset>
> <legend><%= @title %></legend>
>
> <%= error_messages_for ''spec'' %>
>
> <div class="form_row">
> <label for="gender">Gender:</label>
> <%= radio_button :spec, :gender, "Mand" %> mand
> <%= radio_button :spec, :gender, "Kvinde" %> kvinde
> </div>
> <div class="form_row">
> <label for="birthdate">Birthdate:</label>
> <%= date_select :spec, :birthdate,
> :start_year => Spec::START_YEAR,
> :end_year => Time.now.year,
> :include_blank => true,
> :order => [:day, :month, :year] %>
> </div>
>
> <div class="form_row">
> <label for="area">Area:</label>
> <%= select(:spec, :area, Spec::VALID_AREAS) %>
> </div>
>
> <div class="form_row">
> <label for="music_style">Musik style:</label>
> <%= check_box(:spec, :music_style, {}, "Rock", nil) %> Rock
>
>
>
> </div>
>
> <%= text_field_for form, "zip_code", Spec::ZIP_CODE_LENGTH
%>
>
> <%= submit_tag "Update", :class => "submit"
%>
> </fieldset>
> <% end %>[/code]
> Migrate:
> [code=]class CreateSpecs < ActiveRecord::Migration
> def self.up
> create_table :specs do |t|
>
> t.column :user_id, :integer, :null => false
> t.column :gender, :string
> t.column :birthdate, :date
> t.column :area, :string, :default => ""
> t.column :zip_code, :string, :default => ""
> t.column :music_style, :mediumtext, :default =>
""
> # t.column :music_instruments, :mediumtext, :default =>
""
> # t.column :looking_for, :mediumtext, :default =>
""
>
> end
> end
>
> def self.down
> drop_table :specs
> end
> end[/code]
> Please help a noob
>
> Regards Benjamin
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
I got the view now :) now i just need to get the controller i''m not
sure
what you mean.
What do you suggest I do? when a user saves his specs the checked
checkboxes do get stored, but when he wants to update the checkboxes
status aren''t stored anymore so if he clicks update, all the info in
the
checkboxes are deleted
Thanks for the answer.
my view looks like this
<div class="form_row">
<label for="music_style">Music style:</label>
<% Spec::VALID_STYLES.each do |music_style| %>
<%= check_box_tag "spec[music_style][]", music_style %>
<%= music_style %>
<br />
<% end %>
</div>
And my contoller looks like this
def edit
@title = "Opdater info"
@user = User.find(session[:user_id])
@user.spec ||= Spec.new
@spec = @user.spec
if param_posted?(:spec)
if @user.spec.update_attributes(params[:spec])
flash[:notice] = "Ændringer gemt"
redirect_to :controller => "user", :action =>
"index"
end
end
end
> Then in the update, or create, you will have a parameter style array
> with "style"=>["Pop", "Elektronisk",
"Hip-Hop", "R&B og Soul"]
>
> You can then set the style from this array by converting it to string.
> ie style = params[:style]
> style.select {|s| spec.music_style += s }
>
> or something similar
>
> hope this helps.
>
>
> Serge Chevarie-Pelletier
>
>>
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---