我的情况是xm:
9.766216216216216e-03
9.855405405405405e-03
9.944594594594595e-03
1.003378378378379e-02
ym:
-1.868625000000000e-02
-1.860375000000000e-02
-1.852125000000000e-02
U
6.487719505906355e+00 6.484595542834822e+00 6.481272513725735e+00
6.477425806839037e+00 6.473901821157769e+00 6.470151122571268e+00
6.467458053085517e+00 6.463566151187538e+00 6.459423008027734e+00
6.457841717053478e+00 6.453616696740410e+00 6.449119373006629e+00
V
4.236207101112219e-01 4.331423817443223e-01 4.430340743163148e-01
4.192580815416967e-01 4.284782537255764e-01 4.380387484097269e-01
4.145086688064563e-01 4.234037796164705e-01 4.326070249871855e-01
4.094208818538826e-01 4.179700104710450e-01 4.267929343674793e-01
有很多Game
。设置为todo应用程序我有一个表单,用户可以在其中创建他们想要完成的成就列表。他们首先从下面的游戏成就中选择游戏。
我面临的挑战是异步收集Achievements
特定游戏的成就。因此,如果用户选择 Halo ,那么所有成就都将从该选择框的更改事件中加载。
我对编写更改事件有一个大致的想法,但是想知道如何为此编写ajax来加载成就。
模型
belong_to
任务表单
class User
has_many :tasks
end
class Task < ActiveRecord::Base
has_many_and_belongs_to_many :achievements
belongs_to :user
belongs_to :game
end
class Game < ActiveRecord::Base
has_many :tasks
has_many :achievements
end
class Achievements < ActiveRecord::Base
has_and_belongs_to_many :tasks
belongs_to :game
end
JS
<%= simple_form_for(@task) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :title %>
<%= f.input :game_id, as: :select, collection: @games, include_blank: "Select a game", input_html: {class: "game-select"} %>
<%= f.input :achievement_ids, as: :select, collection: @achievements, include_blank: "Select achievements", input_html: {multiple: true, class: "achievement-select"} %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
成就控制器
$(function() {
$(".game-select").on("change", function() {
// Load and insert achievements for game into ".achievement-select" select box
});
});
答案 0 :(得分:0)
选择选项应在其value属性中存储游戏ID。建立像
<% game_options = [["",""]] + Game.order("name").all.collect{|game| [game.name, game.id]} %>
<%= select_tag "game_id", options_for_select(game_options), :class => "game-select" %>
game_options变量可以移动到Game类中的类方法中,例如称为&#34; select_options&#34;什么的。
现在,当这种情况发生变化时,你可以从它的价值中读取游戏ID。你可以这样做:
$(function() {
$(".game-select").on("change", function() {
if($(this).val() != ""){
$.getJSON("/achievements", {"game_id": $(this).val()})
.done(function(data){
$.each( data.items, function( i, item ) {
//do something with the json for this achievement
});
});
}
});
});
编辑:我使视图代码使用更现代的rails find语法,并且如果将select更改为空白选项,则javascript也不会执行任何操作。
EDIT2:就像我说的那样,如果我们想发送params [:game_id],并获取所有json数据只是为了获得该游戏ID的成就,那么控制器将需要考虑这些参数。你可以通过各种方式做到这一点,有些方式比其他方式干燥。我会做最简单的事情,而不是最具伸展性的事情。
#in Achievements controller
def index
if params[:game_id]
@achievements = Achievement.where(:game_id => params[:game_id]).all
else
@achievements = Achievement.all
end
respond_to do |format|
format.html { render :action => "index"}
format.json { render :json => @achievements.to_json }
end
end
答案 1 :(得分:0)
所以......比如我们有&#39; simple_form_for(@task)&#39;,它是任务模型的视图表单。
在我看来,你可以在任务模型中写下:
class Task < ActiveRecord::Base
belongs_to :user
belongs_to :game
has_many :achievements, through: :game
end
之后在TasksController中你可以使用: (更新)
def update
@task = Task.find(params[:id])
@achievements = @task.achievements
@achievement_ids = @achievements.map { |a| [a.name, a.id] }
end
用于表格。