Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax加载实例与多个关联_Javascript_Jquery_Ruby On Rails_Ajax_Forms - Fatal编程技术网

Javascript Ajax加载实例与多个关联

Javascript Ajax加载实例与多个关联,javascript,jquery,ruby-on-rails,ajax,forms,Javascript,Jquery,Ruby On Rails,Ajax,Forms,我有一个场景,一个游戏有很多成就。设置为待办事项应用程序我有一个表单,用户可以在其中创建他们想要完成的成就列表。他们首先从中选择游戏,然后从他们的成就中选择该游戏 我面临的挑战是异步收集属于该特定游戏的成就。因此,如果用户选择Halo,则所有成就都将从该选择框的更改事件加载 我对编写变更事件有一个大致的想法,但我想知道如何编写ajax来加载成果 模型 成绩控制员 选择选项应该在其值属性中存储游戏id <% game_options = [["",""]] + Game.order("nam

我有一个场景,一个游戏有很多成就。设置为待办事项应用程序我有一个表单,用户可以在其中创建他们想要完成的成就列表。他们首先从中选择游戏,然后从他们的成就中选择该游戏

我面临的挑战是异步收集属于该特定游戏的成就。因此,如果用户选择Halo,则所有成就都将从该选择框的更改事件加载

我对编写变更事件有一个大致的想法,但我想知道如何编写ajax来加载成果

模型

成绩控制员


选择选项应该在其值属性中存储游戏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" %>
<>编辑:我让View代码使用了更现代的Rails查找语法,如果JavaScript改为空白选项,JavaScript也不会做任何事情。 EDIT2:就像我说的,如果我们想要发送params[:game_id],并获取所有的json数据,只是为了获得具有该游戏id的成就,那么控制器将需要考虑这些params。有各种各样的方法可以做到这一点,有些方法比另一些更干燥。我将做最简单的事情,而不是最可扩展的事情

#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

所以…比如我们有“简单形式”_for@task,它是任务模型的视图窗体

在我看来,您可以在任务模型中编写下一步:

class Task < ActiveRecord::Base
  belongs_to :user
  belongs_to :game
  has_many :achievements, through: :game
end

用于表单。

我会让您的ajax调用一个url,如/Acquisitions?game_id=123,以获取具有该游戏id的所有成就的数据。显然,AcquisitionIndex操作应该知道在获取该参数时要做什么。如果game_id=123不适用于每个调用,您将如何动态调用url?我将执行以下操作:回答正确。我应该如何解释选项选择方法中的+运算符?我找不到所有具有“id”的游戏:all,{:order=>name}找到了0个结果,但正在查找2Oh,我想我使用了一些已被弃用的旧rails语法。我来编辑一下。+只是将两个数组添加到一起http://localhost:3000/achievements?game_id=1 404未找到之前我说过,achievementsindex操作显然应该知道在获得该参数时要做什么。我的意思是,在我的回答中有一个假设,即您有一个成就控制器,可以通过标准的restful路由访问它,例如GET/accessments进入索引操作,GET/accessments/1进入带有params[:id]=1的show操作。此外,AchievementIndex操作的代码应该查看params[:game_id]是否已通过,如果是,则仅加载带有该游戏id的成就。好的,我认为只要设置了必要的成就视图/控制器/路线,一切都已设置。我认为剩下的问题是JS。我没有从我放在代码块中的代码中得到任何东西。。。此任务视图应与TasksController一起使用,而不是与AchievementsController一起使用。。。
class AchievementsController < ApplicationController
  def index
    @achievements = Achievement.all
  end

  def show
    @achievement = Achievement.find(params[:id])
  end
end
<% game_options = [["",""]] + Game.order("name").all.collect{|game| [game.name, game.id]} %>
<%= select_tag "game_id", options_for_select(game_options), :class => "game-select" %>
$(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
          });
        });
    }
  });

});
#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
class Task < ActiveRecord::Base
  belongs_to :user
  belongs_to :game
  has_many :achievements, through: :game
end
def update
  @task = Task.find(params[:id])    
  @achievements = @task.achievements
  @achievement_ids = @achievements.map { |a| [a.name, a.id] }
end