[英]How to pass parameter to js.erb in Rails?
我想要一个ajax请求来调用带有传递的参数stage
user
控制器的xyz
操作,然后将其附加在#the_box
以便我可以执行条件操作,例如对于阶段x
append @user.age
,对于阶段y
append @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>
和users_controller.rb
有
before_action :set_user, only: [ :xyz]
def xyz
respond_to do |format|
format.js {}
end
end
private
def set_user
@user = User.find(params[:id])
end
这个xyz.js.erb
是我现在拥有的,但是无法处理参数,因此无法处理条件操作
$("#the_box").append("<%= @user.age%>");
其他答案将在这里帮助您-让我解释一下
format.js
当您使用format.js
过滤mime types
,大括号会告诉Rails您想要执行一些自定义功能(因此默认情况下不会加载[action].js.erb
)
如果只想调用[action].js.erb
,则必须调用以下代码:
respond_to do |format|
format.js #-> will just call [action].js.erb
end
您将需要阅读更多有关Rails MIME类型(如何确定XHR请求)和respond_to
块的信息。
@instance_variables
其次,您需要考虑@instance variables
在应用程序中的作用,并因此考虑所@instance variables
的方法。
您遇到的主要问题是在undefined method ___ for nil:NilClass
调用@user
因此, undefined method ___ for nil:NilClass
或类似undefined method ___ for nil:NilClass
您可能会看到错误的undefined method ___ for nil:NilClass
您必须记住, Rails只是一颗宝石 -一系列在Ruby语言上运行的类。 这意味着每次您希望对“对象” /数据片段执行方法时,都需要在Rails应用程序中声明/创建对象:
def xyz
@user = User.find params[:id] #-> sets the variable for the duration of the "instance"
...
end
请记下变量的名称 -一个实例变量。 通过设置@user
(实例变量始终使用@
定义),只要调用定义变量的类 ,就可以使Rails基本上能够访问其中的数据。
基本上意味着,如果您设置@user = User.find
,它将可以通过您的view
和其他从类实例调用的帮助器方法使用
固定
最后,直接解决您的问题:
我想要一个ajax请求,以通过传递的参数阶段调用用户控制器的xyz动作,然后将其附加在#the_box上,以便我可以执行条件操作,例如对于阶段x追加@ user.age,对于阶段y追加@ user.age + 1,对于阶段z,追加@ user.age-1。 我应该怎么做?
#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 %>");
您应该像这样在帮助器中传递参数:
xyz_user_path(stage: "x")
然后在您的js.erb中,您可以像这样访问它:
<%= params['stage'] %>
在这里,我将访问wish_me操作中定义的实例变量。
controllers / jserb_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
/views/jserb/index.html.erb代码:
<div class="wish-me"></div>
<%= link_to "Wish Me", wishme_path, remote: true %>
/views/jserb/wish_me.js.erb
$(".wish-me").append("<%=j @test %>");
config / routes.rb代码:
match '/index' => 'jserb#index'
match '/wishme' => 'jserb#wish_me', :as => :wishme
现在尝试点击http://<domain-name>/index
,然后单击WishMe链接。 因此,现在您可以将实例变量传递给js.erb并进行访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.