在视图加载完成后呈现局部视图时,如何传递本地变量?

4
更新:我刚刚发现了这个解释为什么我会遇到这个问题的线程(Pass local rails variable to javascript to partial),但它没有列出修复它的步骤(或者至少跳过了太多我还不知道如何做的步骤)。问题似乎是将本地变量传递给局部变量时,该本地变量不再是加载new.html.erb时存在的同一本地变量,因为在单击事件之前未加载局部变量。有可能绕过它吗?谢谢。
原文: 我有一个与链接绑定的点击事件,只有在某些情况下才能正常工作,我不确定为什么。它应该在单击链接时将局部渲染到我的视图中,而无需重新加载页面。
这是我目前拥有的(不起作用):
comps_helper.rb:
def addRound(f)
  render "add_round", f: f
end

comps/new.html.erb

<div id="add_round"></div>
<%= link_to "Add round", addRoundLink_path, remote: true %>

addRoundLink.js.erb

$("#add_round").html("<%=j addRound(f) %>");

有效的方法:

  1. 如果我直接在new.html.erb中使用<%= addRound %>调用帮助方法,那么它可以工作。但是我需要在链接被点击时触发它,以便用户可以根据需要添加表单的多个部分。

  2. 如果上面的代码不包括"f"参数,则javascript可以通过点击工作。例如,如果我更改局部文件,使其只包含文本字符串,则在单击链接时将呈现该文本。这使我认为在javascript中包含“f”参数存在问题。但是我不确定为什么会这样,因为javascript难道不只是将该代码插入到new.html.erb中,我在该文件中有一个带有“add_round”id的div吗?

注意:当我单击该链接时,在我的javascript控制台中看到以下内容:

GET http //0.0.0.0:3000/addRoundLink 500 (Internal Server Error)
jquery.js:8215

谢谢。

1个回答

3

这个问题的原因是f只存在于你的控制器操作的上下文中。

当用户点击链接时,会发送一个新的HTTP请求来获取你的JavaScript。处理此请求的控制器操作与呈现页面的控制器操作不同,因此你需要在此控制器操作中设置f并将其作为本地变量传递给addRoundLink.js.erb。

示例代码

  • 我假设f由你的模型对象/实例确定。

在你的控制器中

   def add_round
        model = MyModel.find params[:id]
        f = model.determine_f

        render :partial => 'add_round', :locals => { :f => f }
   end

在你的new.html.erb文件中:
<%= link_to "Add Round", add_round_path(@model), :remote => true %>

谢谢,那很有道理。然而,本地变量'f'实际上只是表单构建器的一部分,在这种情况下,局部变量只包含表单的其他部分(所以我不认为在这种情况下'f'是由我的模型对象/实例确定的,对吧?)我应该更加具体。有没有办法传递这个'f'变量? - Josh
1
链接中的答案可能会对您有所帮助。您可以将模型传递到partial中,并在partial内部使用form_for来获取FormBuilder对象,或者您可以在控制器中实例化一个并将其传递进去。https://dev59.com/2XRC5IYBdhLWcg3wOeSB - kits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接