Javascript 如何在Rails中将参数传递给js.erb?
我想创建一个ajax请求,用传递的参数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
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", 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 %>");