开发者

How to add dynamic Javascript code from view helper in Ruby on Rails 3?

开发者 https://www.devze.com 2023-01-30 10:28 出处:网络
Consider the following code from one of the view files: <table> <tr> <th><%= f.label(:shop, \"Shop:\") %></th>

Consider the following code from one of the view files:

<table>
  <tr>
    <th><%= f.label(:shop, "Shop:") %></th>
    <td><%= select_with_new_option(f, :shop, :name, :id) %></td>
  </tr>
  ...
</table>

select_with_new_option is my helper method that is defined in app/helpers/application_helper.rb. It generates a select box, containing all shops in this case, and in addition "Create new shop" option.

I would like to add a Javascript code that will display:

<div>
  <label for="new_shop">New shop:</label>
  <input id="new_shop" name="new_shop" type="text" />
</div>

once the "Create new shop" option is selected.

Is that possible to generate this Java开发者_运维百科script code from select_with_new_option, or I should do this in other way ?


Since I can't see your generated code, I am just making this up, but you'll have to fine tune to suit your needs... (this also assumes you're using jQuery, modify as needed).

Assuming your output looks something like like:

table code and such

<select id="shop_select">
  <option value="new">New Shop</option>
  <!-- other options -->
</select>

somewhere on the page lives your div

<div id="new_shop_holder" style="display: none;">
  <label for="new_shop">New shop:</label>
  <input id="new_shop" name="new_shop" type="text" />
</div>

<script type="text/javascript">    
$(function(){
  var $new_shop_holder = $('#new_shop_holder');
  $('select#shop_select').change(function(e) {
    if (this.value == 'new') { $new_shop_holder.show(); }
    else { $new_shop_holder.hide(); }
  });
});
</script>


You can try

<%= select('shop', 'name', get_shop_name, {:include_blank => "Create"}, :onchange => "show_new_form();") %>

where show_new_form is the javascript for hiding and displaying your new shop holder div or you can use

<%= select('shop', 'name', get_shop_name, {:include_blank => "Select"}, :onchange => "new Ajax.Updater('options', 'action_url', {asynchronous:true, evalScripts:true, parameters:value})") %>

and an action in your controller

def action_url
render :update { |page| page.replace_html "new_shop_holder", :partial => 'add_new_shop' } if value == ""
end

This will call the partial having the form to enter new shop only if create a shop is selected.

0

精彩评论

暂无评论...
验证码 换一张
取 消