2012-09-11 66 views
2

更新:我刚刚发现这个其他线程,解释了为什么我遇到此问题(Pass local rails variable to javascript to partial),但未列出步骤修复它(或者至少它跳过了太多我还不知道该怎么做的步骤)。问题似乎是,传递给局部变量的局部变量不再是new.html时存在的局部变量.erb被加载,因为部分直到click事件才被加载。有可能解决这个问题吗?谢谢。将局部变量传递给视图已经加载后呈现的局部

原文:

我绑一个链接,只能在某些时候click事件,我不知道为什么。当单击链接而不重新加载页面时,它应该呈现给我的视图。

这是我现在有(没有工作):

comps_helper.rb:

def addRound(f) 
    render "add_round", f: f 
end 

谱曲/ 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(内部服务器错误)
的jquery.js:8215

谢谢。

回答

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 %> 
+0

感谢。这就说得通了。然而,局部变量'f'实际上只是表单生成器的一部分,部分只包含表单的其他部分(所以我不认为'f'是由我的模型对象/实例确定的,它?)我应该更具体。无论如何要通过这个变量? – Josh

+1

链接中的答案可能会对您有所帮助。你可以将你的模型传递给partial,并在你的partial中使用form_for来获得FormBuilder对象,或者你可以在控制器中实例化一个,然后传入它。http://stackoverflow.com/questions/371147/rails-ajax-my -partial-需求-A-formbuilder实例 – zeikt