目前我在Rails 3中创建类似“体育管理和结果收集应用程序”的内容。在这个应用程序中,我需要创建几个练习本身可以有多个“结果类型”(心率,距离) km,repititions,...)。并且应该可以按照我的首选顺序排列结果类型。所以,这是一种经典的多对多关系。
我提出了以下迁移:
class CreateExercises < ActiveRecord::Migration
def self.up
create_table :exercises do |t|
t.integer :user_id
t.string :name
t.text :beschreibung
t.integer :resulttype_id
t.boolean :active, :default => true
t.timestamps
end
end
def self.down
drop_table :exercises
end
end
class CreateResulttypes < ActiveRecord::Migration
def self.up
create_table :resulttypes do |t|
t.string :name
t.string :einheit
t.text :beschreibung
t.timestamps
end
end
def self.down
drop_table :resulttypes
end
end
class CreateExercisesResulttypesJoin < ActiveRecord::Migration
def self.up
create_table :exercises_resulttypes, :id => false do |t|
t.integer "exercise_id"
t.integer "resulttype_id"
end
add_index :exercises_resulttypes, ["exercise_id", "resulttype_id"]
end
def self.down
drop_table :exercises_resulttypes
end
end
与这个形式代码完美配合:
<%= semantic_form_for(@exercise) do |f| %>
<%= f.inputs do %>
<%= f.input :name %>
<%= f.input :beschreibung %>
<%= f.input :resulttype %>
<%= f.input :active %>
<% end %>
<%= f.buttons %>
<% end %>
问题在于,使用此代码我无法对结果类型进行排序,并且每个练习只能使用一次结果类型。 所以我将formtastic:resulttype表单代码改为this(除了jquery代码):
<div id="conn_ctrl" class="float_left center">
<div class="float_left center">
<%= f.select :resulttypes, @resall.collect{|d| [d.name,d.id]}.sort, {}, { :multiple => true, :class => "conn_select" } %><br>
</div>
<div class="float_left center">
<%= f.select :resulttypes, '', {}, { :multiple => true, :id => "exercise_resulttypes_save", :class => "conn_select" } %><br>
</div>
<div style="clear: both"></div>
<%= tag("input", { :type => "button", :id => "remove", :class => "dualbuttons", :name => "", :value => "<<" }, false) %>
<%= tag("input", { :type => "button", :id => "add", :class => "dualbuttons", :name => "", :value => ">>" }, false) %>
<%= tag("input", { :type => "button", :id => "up", :class => "dualbuttons", :name => "", :value => "Up" }, false) %>
<%= tag("input", { :type => "button", :id => "down", :class => "dualbuttons", :name => "", :value => "Down" }, false) %><br>
</div>
<div style="clear: both"></div>
现在我有一个“双列表框”,我可以多次为这个特定的锻炼添加练习,并按照我喜欢的方式订购它。 但是,当我提交表单时,我收到此错误,我不知道这意味着什么:
期望的结果类型(# - 614051528),得到字符串(# - 608366078)
提交的参数是:
{"commit"=>"Create Exercise",
"authenticity_token"=>"v1l9zfxdxIJbdjZx6SsZ5tGuKMrlioBg+C9orSmVarA=",
"utf8"=>"✓",
"exercise"=>{"name"=>"dddd",
"beschreibung"=>"ddddd",
"resulttypes"=>["5",
"3",
"1"],
"active"=>"1"}}
这让我疯狂了一点。我希望你知道为什么会这样......
答案 0 :(得分:5)
这是一个典型的错误:设置ID必须使用setter association_ids=
,Rails需要association=
的对象数组。所以你应该写:
<%= f.select :resulttypes_ids, .... %>