繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM