Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.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 如何在Rails中将参数传递给js.erb?_Javascript_Jquery_Ruby On Rails_Ruby_Ajax - Fatal编程技术网

Javascript 如何在Rails中将参数传递给js.erb?

Javascript 如何在Rails中将参数传递给js.erb?,javascript,jquery,ruby-on-rails,ruby,ajax,Javascript,Jquery,Ruby On Rails,Ruby,Ajax,我想创建一个ajax请求,用传递的参数stage调用user控制器的xyz操作,然后将其附加到#u框上,这样我就可以执行类似stagex附加@user.age,对于阶段y附加@user.age+1和阶段z附加@user.age-1。我该怎么办 我有一个html.erb文件包含以下代码: <center> <%= link_to "A", xyz_user_path, stage: "x", remote: true %> <%= link_to "B", x

我想创建一个ajax请求,用传递的参数
stage
调用
user
控制器的
xyz
操作,然后将其附加到
#u框
上,这样我就可以执行类似stage
x
附加
@user.age
,对于阶段
y
附加
@user.age+1
和阶段
z
附加
@user.age-1
。我该怎么办

我有一个html.erb文件包含以下代码:

<center>
  <%= link_to "A", xyz_user_path, stage: "x", remote: true %>
  <%= link_to "B", xyz_user_path, stage: "y", remote: true %>
  <%= link_to "C", xyz_user_path, stage: "z", remote: true %>
</center>
<div id="the_box"></div>
这个
xyz.js.erb
就是我现在拥有的,但是不能处理参数,所以不能处理条件操作

$("#the_box").append("<%= @user.age%>");
$(“#方框”)。附加(“”);

您应该像这样在帮助程序中传递参数:

xyz_user_path(stage: "x")
然后在你的js.erb中,你可以像这样访问它:

<%= params['stage'] %>

在这里,我将访问wish\u me action中定义的实例变量

控制器/jserb\u controller.rb代码:

class JserbController < ApplicationController
  def index
  end
  def wish_me
    @test = 'Hi how are you?'
    respond_to do |format|
      format.js
    end
  end
end
<div class="wish-me"></div>
<%= link_to "Wish Me", wishme_path, remote: true %>
match '/index' => 'jserb#index'
match '/wishme' => 'jserb#wish_me', :as => :wishme
现在尝试点击
http:///index
然后单击WishMe
链接现在您可以将实例变量传递给js.erb并访问相同的实例变量。

其他答案将在这方面帮助您-让我解释一下


format.js

当您使用
format.js
来过滤
mime类型时,打开括号基本上告诉Rails您想要执行一些自定义功能(因此它不会默认加载
[action].js.erb

如果只想调用
[action].js.erb
,则必须调用以下命令:

respond_to do |format|
   format.js #-> will just call [action].js.erb
end
你会想读更多关于这个街区的书


@instance\u变量

第二,您需要在应用程序中考虑<代码>实例变量< /代码>的作用,因此考虑该方法。 您遇到的主要问题是,您在一个没有定义它的方法中调用

@user
,因此您可能会看到错误
undefined method\uuuuuuuuuiL:NilClass
或类似错误

您必须记住——一系列在Ruby语言上运行的类。这意味着,每当您希望对“对象”/数据块执行方法时,您都需要在Rails应用程序中声明/创建对象:

def xyz
   @user = User.find params[:id] #-> sets the variable for the duration of the "instance"
   ...
end
请注意变量的名称--一个实例变量。通过设置
@user
(实例变量总是用
@
定义),只要调用定义变量的类,Rails基本上就可以访问其中的数据

基本上意味着,如果您设置
@user=user.find
,它将通过从类实例调用的
视图
和其他帮助器方法可用


修复

最后,要直接回答您的问题:

我想通过一个ajax请求调用用户控制器的xyz操作 传递的参数stage,然后将其附加到#u框上,以便 可以执行条件操作,如stage x append@user.age, 对于阶段y追加@user.age+1,对于阶段z追加@user.age-1。怎么 我该怎么办

#config/routes.rb
资源:用户可以
获取“xyz/:stage”#->domain.com/users/:user\u id/xyz/:stage
结束
#app/views/users/your_view.html.erb
#app/controllers/users\u controller.rb
类UsersController
您可以删除响应中format.js后面的括号。有什么区别吗?是的,我会为您解释它不起作用。xyz.js.erb是否导出javascript文件供浏览器读取?如果是这样的话,我可以检查出哪里出了问题。我只是想说一个有很多信息的好答案。嘿,没问题!很高兴它有帮助!你在没有定义@user的方法中调用它是什么意思?在操作:设置用户之前是否
,仅:[:xyz]
不正确?事实上,我不知道@user是如何传递给xyz.js.erb的机制,也不知道xyz.js.erb属于哪个类。嘿,Marcus,很抱歉-我确实看到了你对
set\u user
的调用,但在我写下答案之后。为了简单起见,我把它留在里面了
respond_to do |format|
   format.js #-> will just call [action].js.erb
end
def xyz
   @user = User.find params[:id] #-> sets the variable for the duration of the "instance"
   ...
end
#config/routes.rb
resources :users do
   get "xyz/:stage" #-> domain.com/users/:user_id/xyz/:stage
end

#app/views/users/your_view.html.erb
<% links = [["A", "x"], ["B", "y"], ["C", "z"]] %>
<% links.each do |link, stage| %>
    <%= link_to link, xyz_user_path(user, stage: stage), remote: true %>
<% end %>

#app/controllers/users_controller.rb
Class UsersController < ApplicationController
   def xyz
      case params[:stage]
        when "x"
          @user.increment!(:age)
        when "y"
          @user.decrement!(:age)
      end
      respond_to do |format|
         format.js
      end
   end
end

#app/views/users/xyz.js.erb
$("#the_box").append("<%=j @user.age %>");