Ajax从has_many关联加载实例

时间:2015-06-24 14:22:47

标签: javascript jquery ruby-on-rails ajax forms

我的情况是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
  });
});

2 个答案:

答案 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

用于表格。