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

时间:2014-08-22 09:03:16

标签: javascript jquery ruby-on-rails ruby ajax

我希望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%>");

3 个答案:

答案 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并访问它。