Thanks for the help. If we really want to make this into a chapter into the book, though, I'd want to emphasize how we're moving from generic HTML & Hobo's generated select-one to the radio buttons. Your "test" step is awesome, but before the "test" step, cut & paste from the generated HTML into the text and pull your id's from that rather than from SQlite.
thanks, Bryan On Mar 30, 12:33 pm, simple_n00b <[email protected]> wrote: > I wrote everything out as I did it in tutorial form. This works with > the application as it is at the end of tutorial seven, and goes until > the last part which I haven't been able to get working yet. Hopefully > it will help others. > ---------------- > > In Views > taglibs > application.dryml > Add: > > <extend tag="form" for ="Recipe"> > <old-form merge> > <field-list: fields="title,body,country"> > <country-view:> > test > </country-view:> > </field-list:> > </old-form> > </extend> > > In the browser, make sure you are logged in as administrator, and go > to:http://localhost:3000/recipes/newand see the word “test” > appearing next to the “Country” Label. Then navigate to the edit page > of a particular recipe, for example:http://localhost:3000/recipes/1- > barbequed-chicken-wings/edit and see the same ”test” text. > > Going back to Views > taglibs > application.dryml replace the word > “test” with the following: > > <input type="radio" name="recipe[country_id]" value="1" checked > />American<br/> > > <input type="radio" name="recipe[country_id]" value="2" />Chinese<br/> > <input type="radio" name="recipe[country_id]" value="3" />French > > To see it on the edit page, return > there:http://localhost:3000/recipes/1-barbequed-chicken-wings/editand > select a country. > > Then go back to the recipes show > page:http://localhost:3000/recipes/1-barbequed-chicken-wings > > If the result is not what you selected, it is because you do not have > that country name associated with that country_id. This will have been > based on the order in which you added the countries. You should be > able to correct it by shuffling around the values in your radio button > code. > > A quick way to find what your country_id values should be is to view > your database. For a SQLite db, it can be done with the firefox > extension “SQLite manager”. With this installed and open, navigate to > one_table\db and open development.sqlite3. View the countries table, > and note which id is next to which name. These are the values to be > used in the radio buttons. > So this will work for this hardcoded example, but ultimately we want > the correct values to automatically be populated dynamically. > > Lets start by having it find the right id number given the name: > <input type="radio" name="recipe[country_id]" > value="#{Country.find_by_name('American').id}" checked />American<br/> > <input type="radio" name="recipe[country_id]" > value="#{Country.find_by_name('Chinese').id}" />Chinese<br/> > <input type="radio" name="recipe[country_id]" > value="#{Country.find_by_name('French').id}" />French > > Next we want to eliminate the hardcoded check for “American” and > instead have our current value display as checked. > > <input type="radio" name="recipe[country_id]" > value="#{Country.find_by_name('American').id}" checked = > "&this._?.name=='American'" />American<br/> > <input type="radio" name="recipe[country_id]" > value="#{Country.find_by_name('Chinese').id}" checked = > "&this._?.name=='Chinese'" />Chinese<br/> > <input type="radio" name="recipe[country_id]" > value="#{Country.find_by_name('French').id}" checked = > "&this._?.name=='French'" />French > > (Note the difference between #{} and &: #{} does string > substitution > and & uses the ruby value. If we used #{} for checked, it would get > converted from a boolean to a string before Hobo noticed. > > Next, lets remove the need to manually add the country names and > correct number of radio buttons, and instead have them populate from > the database. > > <% Country.all.each do |country| %> > <input type="radio" name="recipe[country_id]" value="#{country.id}" > checked="&this==country"/><%= country.name %><br/> > <% end %> > > On Mar 30, 12:24 pm, simple_n00b <[email protected]> wrote: > > > > > > > > > Hi Bryan, I tried this and got everything to work until the last > > example. I put it in application.dryml like so: > > > <!-- radio for a belongs_to --> > > <def tag="radio-one" attrs="options,limit"> > > <% saved_this = this > > conditions = > > ActiveRecord::Associations::BelongsToAssociation.new(this_parent, > > this_field_reflection).conditions if options.nil? > > options ||= this_field_reflection.klass.all(:conditions => > > conditions, :limit => limit).select {|x| can_view?(x)} %> > > <repeat with="&options"> > > <input type="radio" name="¶m_name_for_this(true)" > > value="&this.id" checked="&saved_this==this"/><view/><br/> > > </repeat> > > </def> > > > <extend tag="form" for ="Recipe"> > > <old-form merge> > > <field-list: fields="title,body,country"> > > <country-view:> > > <radio-one/> > > </country-view:> > > </field-list:> > > </old-form> > > </extend> > > > and got an error: > > DRYML cannot provide the correct form-field name here... > > > On Mar 30, 9:38 am, Bryan Larsen <[email protected]> wrote: > > > > Both your suggestions will work, it's just that application.dryml is one > > > place, and new/edit.dryml are two places. > > > > If you put it in application.dryml, the form definition would look > > > something like: > > > > <extend tag="form" for ="Recipe"> > > > <old-form merge> > > > <field-list: fields="title,body,country"> > > > <country-view:> > > > > ... > > > > </country-view:> > > > </field-list:> > > > </old-form> > > > </extend> > > > > On 11-03-30 09:15 AM, simple_n00b wrote: > > > > > Hi Bryan, thank you for the in depth reply. > > > > I plan to try all of this code out, and will debug appropriately and > > > > post the working results, if no one else beats me to it. > > > > The only thing that is a little bit difficult for me to figure out is > > > > what file each of these snippets should go in with regard to the > > > > standard hobo structure. I will probably be working with the project > > > > as it looks at the end of tutorial 7. > > > > > should all of this go in application.dryml, or views> recipes> > > > > new.dryml / edit.dryml? > > > > > should I be following the instructions in "Tutorial 15 - New and Edit > > > > Pages with The Form Tag" > > > > and start with: > > > > > <extend tag="form" for ="Recipe"> > > > > <old-form merge/> > > > > </extend> > > > > > Again thanks for your help. > > > > I would love to see all form elements be made easy to implement in > > > > hobo, and will gladly contribute my own time and limited knowledge to > > > > finding a solution. > > > > > On Mar 29, 2:23 pm, Bryan Larsen<[email protected]> wrote: > > > >> As a first step, we should start with HTML as plain as we can get it. > > > > >> Here's the HTML for the first result of "html radio example": > > > > >> <input type="radio" name="group1" value="Milk"> Milk<br> > > > >> <input type="radio" name="group1" value="Butter" checked> Butter<br> > > > >> <input type="radio" name="group1" value="Cheese"> Cheese > > > > >> To integrate with Hobo and rails we need to get both name and value set > > > >> correctly. How do we figure that out? Simple, take a look at the > > > >> source code output by the stock Hobo app for the select box. In your > > > >> case, you'd probably find the name is recipe[country_id], and the > > > >> values > > > >> for the options in the select are probably 1& 2 (but could quite > > > >> likely > > > >> be something else). > > > > >> So this should work. Terribly hard coded, but it would work: > > > > >> <input type="radio" name="recipe[country_id]" value="1" checked > > > >> />American<br/> > > > >> <input type="radio" name="recipe[country_id]" value="2" />Chinese > > > > >> Note that I had to adjust the tags slightly to use valid XML syntax. > > > > >> Let's remove the hardcoding one by one. First let's make sure we're > > > >> both working in the same context: > > > > >> <form> > > > >> <field-list fields="title,body,country"> > > > >> <country-view:> > > > >> <input type="radio" name="recipe[country_id]" value="1" checked > > > >> />American<br/> > > > >> <input type="radio" name="recipe[country_id]" > > > >> value="2"/>Chinese<br/> > > > >> </country-view:> > > > >> </field-list> > > > >> </form> > > > > >> Inside of country-view our context (aka this) is set to the country, > > > >> and > > > >> this_parent is set to the recipe. > > > > >> The first obvious problem is those numbers: they'll be different on > > > >> different installations -- some fiddling in the console let's us come > > > >> up > > > >> with code to figure them out dynamically: > > > > >> <input type="radio" name="recipe[country_id]" > > > >> value="#{Country.find_by_name('American').id}" checked/>American</br> > > > > >> The next obvious problem is that "checked". Our hardcoded code always > > > >> sets it to "American", we want it to be set to our current value. The > > > >> current value is in 'this', so let's use it: > > > > >> <input type="radio" name="recipe[country_id]" > > > >> value="#{Country.find_by_name('American').id}" > > > >> checked="&this._?.name=='American'"/>American<br/> > > > > >> (Note the difference between #{} and&: #{} does string substitution > > > >> and& uses the ruby value. If we used #{} for checked, it would get > > > >> converted from a boolean to a string before Hobo noticed. > > > > >> Many people could stop here, but let's keep going. The next step would > > > >> be to pull the countries from the database rather than hardcoding them. > > > > >> <% Country.all.each do |country| %> > > > >> <input type="radio" name="recipe[country_id]" value="#{country.id}" > > > >> checked="&this==country"/><%= country.name %><br/> > > > >> <% end %> > > > > >> We used an ERB style loop here. Let's compare with a DRYML style loop: > > > > >> <% saved_this = this %> > > > >> <repeat with="&Country.all"> > > > >> <input type="radio" name="recipe[country_id]" value="#{this.id}" > > > >> checked="&saved_this==this"/><view/><br/> > > > >> </repeat> > > > > >> Notice a couple of things: repeat changes the context, so I saved off > > ... > > read more » -- You received this message because you are subscribed to the Google Groups "Hobo Users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/hobousers?hl=en.
