Har*_*lap 4 ruby ruby-on-rails ruby-on-rails-3
目前我在Rails 3中创建类似"体育管理和结果收集应用程序"的东西.在这个应用程序中,我需要创建几个练习本身可以有多个"结果类型"(心率,距离,公里,重复,...).并且应该可以按照我的首选顺序排列结果类型.所以,这是一种经典的多对多关系.
我提出了以下迁移:
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
Run Code Online (Sandbox Code Playgroud)
与这个formtastic代码很好地配合:
<%= 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 %>
Run Code Online (Sandbox Code Playgroud)
问题在于,使用此代码我无法对结果类型进行排序,并且每个练习只能使用一次结果类型.所以我将formtastic:resulttype表单代码更改为此(除了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>
Run Code Online (Sandbox Code Playgroud)
现在我有一个"双列表盒",我可以多次为这个特定的锻炼添加练习,并按照我喜欢的方式订购它.但是,当我提交表单时,我收到此错误,我不知道这意味着什么:
结果类型(# - 614051528)预期,得到字符串(# - 608366078)
提交的参数是:
{"commit"=>"Create Exercise",
"authenticity_token"=>"v1l9zfxdxIJbdjZx6SsZ5tGuKMrlioBg+C9orSmVarA=",
"utf8"=>"?",
"exercise"=>{"name"=>"dddd",
"beschreibung"=>"ddddd",
"resulttypes"=>["5",
"3",
"1"],
"active"=>"1"}}
Run Code Online (Sandbox Code Playgroud)
这目前让我疯狂了一点.我希望你知道为什么会这样......
这是一个典型的错误:设置ID必须使用setter association_ids=
,Rails需要一个对象数组association=
.所以你应该写:
<%= f.select :resulttypes_ids, .... %>
Run Code Online (Sandbox Code Playgroud)