Default value in select (ActionView)

Any suggestions on how to put a default value into a select method

eg. f.select :type_id, List.find(:all).collect {|p| [ p.name, p.id ]}

but if the :type_id is nil I want to be able to use the default value from the List Model.

The :select option seems to override the method

nigel.bris wrote:

Any suggestions on how to put a default value into a select method

eg. f.select :type_id, List.find(:all).collect {|p| [ p.name, p.id ]}

but if the :type_id is nil I want to be able to use the default value from the List Model.

Three ways:

1. Put the default as the default value in the database field.     It will automatically be that value rather than nil.

2. Put in your controller:

      @object.type_id ||= List::DEFAULT_TYPE_ID

3. Put in your List.initialize method:

      self.type_id = DEFAULT_TYPE_ID

Great Ideas.....

I probably should of given a bit more info.. List Model is used by multiple models and is a common place for list items (grouped by the model ListGroup) List model has a field called default (boolean) so the user can change the default option. The selection list lives in a helper because it is common to lots of views.

I could do it in the controller, but this would require code each time, as this is in a helper, I want it to write it once. Any other suggestions?

nigel.bris wrote:

Great Ideas.....

I probably should of given a bit more info.. List Model is used by multiple models and is a common place for list items (grouped by the model ListGroup) List model has a field called default (boolean) so the user can change the default option. The selection list lives in a helper because it is common to lots of views.

I could do it in the controller, but this would require code each time, as this is in a helper, I want it to write it once. Any other suggestions?

I'm not understanding how the boolean default field is used, but another way would be to override the AR accessor method of type_id:

class List    def type_id      self[:type_id] || default_type    end end

HI Mark,

Thanks for you help here.....

The default field is in the List model. The List model is open to the client so they can add different options eg. States so if a client than adds a customer card which has their address, the selection list showing the states should defualt to the state marked as defualt in List. I have created a helper to "my_selection" which is sent the List group (eg states group) which means the list will only have states. To keep it dry, I want the "my_selection" to see the item is nil and select the default item.

Niaz Arifin wrote:

Hi Mark, Thought you might cast some light on these:

1. How can I set a default value in a collection_select? To be specific, I have a class 'Platform', and I want to set the platform_code (a field of Platform) to be 'ORA' (which exists in the Platform table). I tried many variations of the following code in my view, but in vain: <% @selected = 'ORA' %> <%= collection_select "sac_table_platform", "platform_code", Platform.find(:all, :order => "platform_code"), :platform_code, :platform_code, { :selected => @selected } %>

Arif, just set @sac_table_platform.platform_code = 'ORA', either in your controller or in Platform.initialize

2. How can I build my own list of collection_select, e.g., a list of three people, say, to show [Adam, Bob, Charley] on the collection_select for the corresponding values ['A', 'B', 'C'] in a table (which already exists), and use it in my view?

Just use an ordinary select having options parameter    [['Adam','A'], ['Bob','B'], ['Charley','C']]

Niaz Arifin wrote:

Hi Mark, Thanks a lot... setting @sac_table_platform.platform_code = 'ORA' worked for the default case, but it created a new problem for me: now when I tried to specifically select a value (eg, 'NSK') from the collection_select, it didn't. Instead, it always selected 'ORA'. I tried to include a blank in the list, and put an if-condition in the controller, but now it gets a null for 'platform_code'. Could you please tell me what I am doing wrong?

You only want to set @sac_table_platform.platform_code = 'ORA' for a request.get?. So either (1), add this condition to an assignment in the controller, (2), set platform_code in SacTablePlatform.initialize using self.platform_code ||= 'ORA' after calling super, or (3), add 'ORA' as the default value for platform_code in your database table.