【问题标题】:Rails 4: Passing a local variable to a js.erb file from a partial containing a form_for helperRails 4:将局部变量从包含 form_for 帮助器的部分传递给 js.erb 文件
【发布时间】:2015-01-12 07:47:51
【问题描述】:

如何将局部变量从 form_for 助手传递到 js 文件?

我有以下名为 _subscribe.html.erb 的文件

<%= form_for @subscription, :url => {:controller => "subscriptions", :action => "create"} do |f| %>
  <div><%= hidden_field_tag :group_id, group.id %></div>
  <%= f.submit "Subscribe", class: "btn btn-primary subscribe_btn" %>
<% end %>

group 局部变量从 do 块传递到此表单并可以工作(到目前为止仅 html)。我想把它变成一个 ajax 调用,所以我在表单中添加了 remote: true 并将文件 create.js.erb 添加到订阅文件夹中:

$("#new_subscription").html("<%= escape_javascript(render('subscriptions/unsubscribe', locals: { group: group } )) %>")

这是我的订阅控制器创建操作:

def create
    @subscription = current_user.subscriptions.create(:group_id => params[:group_id])
    @subscription.save
      respond_to do |format|
      format.html { redirect_to groups_path, flash[:success] = "You have successfully subscribed to this group" }
      format.js  
    end
  end

但是现在我得到了这个错误:

ActionView::Template::Error (undefined local variable or method `group' for #<#<Class:0x007fe7ecfd4950>:0x007fe7ecfde7e8>):
    1: $("#new_subscription").html("<%= escape_javascript(render('subscriptions/unsubscribe', locals: { group: group } )) %>")
  app/views/subscriptions/create.js.erb:1:in `_app_views_subscriptions_create_js_erb__3184685282411376061_70317032458920'
  app/controllers/subscriptions_controller.rb:8:in `create'

提交时未将组局部变量从 form_for 传递到 create.js.erb。在过去的 4 个小时里,我已经尝试了所有方法,但仍然不够用。如何解决此问题并将局部变量从 _subscribe.html.erb 部分传递给 create.js.erb 文件?

编辑:

更多代码...首先我的订阅控制器创建操作:

def create
    @group = Group.find(params[:group_id])
    @subscription = current_user.subscriptions.create(:group_id => @group.id)
    @subscription.save
    respond_to do |format|
      format.html { redirect_to groups_path }
      format.js 
    end
  end

并销毁操作:

def destroy
    @group = Group.find(params[:id])
    @subscription = current_user.subscriptions.find_by(group_id: @group.id)
    @subscription.destroy
    respond_to do |format|
      format.html { redirect_to groups_path }
      format.js
    end
   end

& 创建.js.erb

$("#subscribe_button").html("<%= escape_javascript(render('subscriptions/unsubscribe', locals: { group: @group } )) %>")

&destory.js.erb

$("#unsubscribe_button").html("<%= escape_javascript(render('subscriptions/subscribe', locals: { group: @group } )) %>")

我仍然在日志中收到以下错误:

Started POST "/subscriptions" for 127.0.0.1 at 2014-11-20 22:23:39 +0000
Processing by SubscriptionsController#create as JS
  Parameters: {"utf8"=>"✓", "group_id"=>"1", "commit"=>"Subscribe"}
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'b0afd34150d0c021a1e4d0dfa357107a2aa59f00' LIMIT 1
  Group Load (0.4ms)  SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1  [["id", "1"]]
   (0.2ms)  BEGIN
  Subscription Exists (0.6ms)  SELECT 1 AS one FROM "subscriptions" WHERE ("subscriptions"."group_id" = 1 AND "subscriptions"."user_id" = 2) LIMIT 1
  SQL (0.6ms)  INSERT INTO "subscriptions" ("created_at", "group_id", "role", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["created_at", Thu, 20 Nov 2014 22:23:39 UTC +00:00], ["group_id", 1], ["role", "pending"], ["updated_at", Thu, 20 Nov 2014 22:23:39 UTC +00:00], ["user_id", 2]]
   (0.4ms)  COMMIT
   (0.1ms)  BEGIN
  Subscription Exists (0.7ms)  SELECT 1 AS one FROM "subscriptions" WHERE ("subscriptions"."group_id" = 1 AND "subscriptions"."id" != 96 AND "subscriptions"."user_id" = 2) LIMIT 1
   (0.2ms)  COMMIT
  Rendered subscriptions/_unsubscribe.html.erb (100.3ms)
  Rendered subscriptions/create.js.erb (101.7ms)
Completed 500 Internal Server Error in 120ms

ActionView::Template::Error (undefined local variable or method `group' for #<#<Class:0x007fdc05a244a8>:0x007fdc0545b350>):
    1: <%= debug group %>
    2: <div id="unsubscribe_button"> 
    3: <%= button_to "Unsubscribe", subscription_path(group), :remote => true, :method => 'delete', class:  "btn subscribe_btn" %>
    4: </div>
  app/views/subscriptions/_unsubscribe.html.erb:1:in `_app_views_subscriptions__unsubscribe_html_erb__4479900334468069300_70291478478720'
  app/views/subscriptions/create.js.erb:1:in `_app_views_subscriptions_create_js_erb__1667797080065562395_70291478425360'
  app/controllers/subscriptions_controller.rb:8:in `create'

您可以清楚地看到在创建操作中设置了@group,并且正在成功创建订阅,但未在 js.erb 文件中设置局部变量。

【问题讨论】:

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


    【解决方案1】:

    问题是当您在create 操作中时,您没有在上一个操作中设置的变量。

    所以您需要再次设置@group 实例变量,然后在您的create.js.erb 模板中使用它。

    def create
      @group = Group.find(params[:group_id])
      @subscription = current_user.subscriptions.create(:group_id => @group.id)
      @subscription.save
      respond_to do |format|
        format.html { redirect_to groups_path, flash[:success] = "You have successfully subscribed to this group" }
        format.js
      end
    end
    
    $("#new_subscription").html("<%= escape_javascript(render('subscriptions/unsubscribe', locals: { group: @group } )) %>")
    

    【讨论】:

    • 您好,感谢您的帮助。这仍然会引发相同的错误。我在上面的问题中添加了更多代码。 @group 变量是在 create 操作中设置的,但不是在 create.js.erb 文件中设置的(或者至少它没有根据需要作为局部变量传递)。
    • 如果您看到新错误,它表示 group 变量或方法未定义,而不是 nil。因此,问题可能出在您将属性发送到渲染方法的方式上。我认为您还需要发送partial 密钥,例如:render(partial: 'subscriptions/unsubscribe', locals: { group: @group } )
    • 问题与js代码中的键有关。看上面的答案...感谢您的时间和帮助。
    【解决方案2】:

    你没有。当前请求结束时,即呈现表单时,执行结束。 .js.erb 视图模板在表单提交之前不会被调用,开始一个新的请求。

    您必须创建一个实例变量,例如@group = however_you_get_the_group 在控制器的创建操作中使其对 .js.erb 视图可见,并引用如下:locals: { group: @group }

    【讨论】:

    • locals: { group: @group } 是否使组局部变量在它传递到的部分中可用?你的建议对我不起作用?
    • 是的。但是,您必须确保 @group 在传递时存在,否则您的部分中的 group 将为零。
    • 嘿,我将您的答案标记为技术上正确。我以为我有答案,但今天又回到了这个问题,我仍然遇到一个问题,即局部变量没有从 js 文件中传递。我已经更新了上面的问题以包含订阅控制器代码。
    • 大多数时候不需要在渲染中使用“locals”键,尝试更改为:$("#subscribe_button").html("&lt;%= escape_javascript(render('subscriptions/unsubscribe', group: @group )) %&gt;") 虽然我不确定它是否会有所作为
    • 您也可以在尝试访问 group 以查看存在哪些本地人之前尝试在部分中调试 local_assigns 的状态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多