I would love to see it as a tutorial, and would be happy to contribute. Here is what I am imagining. At the end of the current tutorial 8 these is a has many realtionship defined between countries and recipes and also a has many though defined between recipies and categories. All with the default form elements.
At this point I think it would be great to insert a tutorial on setting up non-default form elements for the established structure. There could be three sections in this tutorial 1) The introduction of radio buttons on the recipes form to select a country as we have done here. 2) The introduction of :accessible => true to the country model to add new recipes from the country form 3) The introduction of a checkbox group for the has many through relationship of recipes and categories. Also is there any way for a parent to be created from the form of a child? I am imagining a situation where you knew that the recipe you wanted to add was for a country that had no yet been entered into the db? Technically you can achieve this on one page if you started on the country form which had :accessible => true and allowed you to add the recipe. However, in my experience as a user, I find my mind doesn't work that way. I have a grocery list app on my phone where items are sorted by aisle. When I was trying to add a new item in a new aisle, I always find myself adding the item first, then navigating to the page to add the aisle, then back to the item page to make the association. This tutorial app would have you doing the same things if you started with a recipe, then had to add the country then go back to the recipe to associate it. So I would love to figure out how to add a new parent when creating a child. On Mar 30, 3:55 pm, Bryan Larsen <[email protected]> wrote: > 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/newandsee 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 > > ... > > 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.
