多額の借入:
https://github.com/heroku/hstore_example
新しいモデルを作成し、hstore 列が適切に設定され、モデルが保存されるときに、New ビューから任意の数の "params" (私の hstore 列) を定義できます。完全!!
ただし、編集して送信しようとすると、次のようになります。
パラメータ「id」の予想されるハッシュ(文字列を取得)
「id」は、作成した「param」の hstore キーに付けた名前です。
また興味深い...コンソールから同じモデルを問題なく作成および更新できます。
なんてこと?!?
これが私のモデルです:
class Testmethod < ActiveRecord::Base
attr_accessible :name, :params
serialize :params, ActiveRecord::Coders::Hstore
def as_json(options = {})
{ :name => name, :params => params }
end
end
フォームは次のとおりです。
<%= form_for(@testmethod) do |f| %>
<% if @testmethod.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@testmethod.errors.count, "error") %> prohibited this testmethod from being saved:</h2>
<ul>
<% @testmethod.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :script %>
<%= f.text_area :script, :rows => 6 %>
</div>
<h4>Parameters</h4>
<div class="well">
<div class='clearfix attributeContainer'>
<div class='row'>
<p class='span3 underline'>Name</p>
<p class='span3 underline'>Value</p>
</div>
<% @testmethod.params.try(:each) do |key, value| %>
<div class="row">
<p class='span3'>
<%= text_field_tag key, key, :class => 'text_field dynamicAttributeName' %>
</p>
<p class='span3'>
<%= text_field key, :class => 'text_field', :value => value %>
</p>
<p class='span1'>
<a herf='#' class='btn removeRow'>X</a>
</p>
</div>
<% end %>
<div class='row attributeTemplate <%= 'hide' if @testmethod.params.present? %>'>
<p class='span3'>
<input class='text_field dynamicAttributeName' id='' name='' placeholder='New Attribute name' size='30' type='text' />
</p>
<p class='span3'><input class='text_field' id='bar' name='' placeholder='value' size='30' type='text' /></p>
<p class='span1'><a herf='#' class='btn removeRow'>X</a></p>
</div>
<%= link_to 'Add Parameter', '#', :class => 'btn addAttribute btn-mini' %>
</div>
</div>
<div class="row">
<div class="span12">
<div class="actions">
<%= f.submit "Save", :class => 'btn btn-primary ' %> or <%= link_to "Cancel", request.referrer || testmethods_path %>
</div>
</div>
</div>
<% end %>
<%= content_for :js do %>
<script type='text/javascript'>
$('.attributeContainer').delegate('.dynamicAttributeName', 'keyup', function(event){
nameElem = $(this);
valueElem = nameElem.closest('.row').children('p').children('.text_field')
value = nameElem.val().toLowerCase();
valueElem.attr('id', 'testmethod_params_' + value );
valueElem.attr('name', 'testmethod[params][' + value + ']');
valueElem.attr('placeholder', 'value for ' + value );
})
$('.attributeContainer').delegate('.removeRow', 'click', function(){
console.log($(this).closest('.row'))
$(this).closest('.row').html('');
})
$('.addAttribute').on('click', function(){
contents = "<div class='row'>" + $('.attributeTemplate').html() + '</div>';
$(this).before(contents);
})
</script>
<% end %>