4

更新:我刚刚发现这个其他线程解释了为什么我遇到这个问题(将本地rails变量传递给javascript到部分),但它没有列出修复它的步骤(或者至少它跳过了我没有的太多步骤'还不知道该怎么做。)问题似乎是传递给局部变量的局部变量不再是加载 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. 如果我只是使用 <%= addRound %> 直接从 new.html.erb 调用辅助方法,它就可以工作。但是我需要在单击链接时触发它,以便用户可以根据需要向表单添加任意数量的部分。

  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

谢谢。

4

1 回答 1

3

它不起作用,因为f仅存在于您的控制器操作的上下文中。

当用户单击您的链接时,会为您的 javascript 发出一个新的 HTTP 请求。处理此请求的控制器操作与呈现页面的操作不同,因此您需要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 %>
于 2012-09-12T01:34:52.307 回答