我希望ajax请求使用传递的参数user
调用xyz
控制器的stage
操作,然后将其附加到#the_box
以便我可以对于阶段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>
和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%>");
答案 0 :(得分:5)
其他答案将帮助您 - 让我解释一下
<强> 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 types (how to determine XHR requests)&amp; respond_to
块
<强> @instance_variables 强>
其次,您需要考虑@instance variables
在您的应用程序中的角色,从而考虑相关方法。
你遇到的主要问题是你在一个没有定义它的方法中调用@user
- 因此你可能会看到错误undefined method ___ for nil:NilClass
或类似的
你必须记住Rails is just a gem - 一系列在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
&amp;从类
<强>修正强>
最后,直接解决您的问题:
我想要一个ajax请求来调用用户控制器的xyz动作 传递的参数阶段然后将其附加到#the_box以便我 可以执行类似于stage x append @ 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 %>");
答案 1 :(得分:0)
您应该在助手中传递参数,如下所示:
xyz_user_path(stage: "x")
然后在您的js.erb中,您可以像访问它一样访问它:
<%= params['stage'] %>
答案 2 :(得分:0)
这里我将访问wish_me action中定义的实例变量。
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 code:
<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并访问它。