【发布时间】: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