【问题标题】:How to pass parameter to js.erb in Rails?如何在 Rails 中将参数传递给 js.erb?
【发布时间】:2014-10-16 02:05:00
【问题描述】:

我想要一个 ajax 请求调用 user 控制器的 xyz 操作并使用传递的参数 stage 然后将其附加到 #the_box 以便我可以执行条件操作,例如舞台 x 附加 @987654326 @,对于舞台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%>");

【问题讨论】:

  • 响应中format.js后面的括号可以去掉。
  • 有区别吗?
  • 是的 - 我会为你解释

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


【解决方案1】:

其他答案会在这里帮助你 - 让我解释一下


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)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 和其他从类实例调用的辅助方法可用


修复

最后,直接解决您的问题:

我想要一个 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 %>");

【讨论】:

  • 只是想用大量信息说出很好的答案
  • 嘿没问题!很高兴它有帮助!
  • 在未定义的方法中调用@user 是什么意思? before_action :set_user, only: [ :xyz] 不合适吗?其实我不知道@user是如何传递给xyz.js.erb的机制以及xyz.js.erb属于什么类。
  • 嗨,马库斯,对此感到抱歉 - 我确实看到了你给 set_user 的电话,但是之后我写了我的答案。为了简单起见,我把它留在了
【解决方案2】:

你应该像这样在帮助器中传递参数:

xyz_user_path(stage: "x")

然后在你的 js.erb 中你可以像这样访问它:

<%= params['stage'] %>

【讨论】:

  • 它不工作。 xyz.js.erb 是否导出 javascript 文件供浏览器读取?如果是这样,我可能会检查出了什么问题。
【解决方案3】:

这里我将访问一个在 wish_me 操作中定义的实例变量。

控制器/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://&lt;domain-name&gt;/index,然后点击WishMe 关联。所以现在你可以将实例变量传递给 js.erb 并访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2015-10-08
    • 1970-01-01
    • 2011-08-25
    • 2011-09-19
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多