更新3:
对于阅读此内容的任何人来说,这就是为什么它在下面的更新2中没有按预期运行的原因:Passing a local variable to a partial that is rendered after the view has already loaded
如果有人知道如何解决这个问题,请告诉我。
更新2:
我使用引号更新了javascript,它部分有效...在javascript现在正常运行的意义上,当我点击链接时它会导致页面上出现一串文字,只要我有部分只包含一串文字。但是,当partial包含表单字段代码时,出现问题。
如果我只是将以下呈现代码直接粘贴到new.html.erb视图中的表单中,它会正确生成新的表单部分。
<%= render "add_round", f: f %>
但是,当我尝试在comps_helper.rb中包含类似代码然后从link_to引用它时,它不起作用:
在comps_helper.rb中:
def addRound(f)
render "add_round", f: f
end
在new.html.erb中:
<%= link_to "render it!", addRoundLink_path, remote: true %>
<div id="some_id"></div>
我将addRoundLink.js.erb更改为:
$("#some_id").html("<%=j addRound(f) %>"); #Is this the correct change to have made here?
在这种情况下,单击link_to链接不会执行任何操作。
有什么想法?
更新后的代码:
感谢您的回复。我做了以下更改,但似乎仍然无法正常工作。链接显示在表单的底部,但单击时不会更改任何内容。我错过了什么?
routes.rb:
resources :comps
match '/new_competition', :to => "comps#new"
get "/addRoundLink" => "comps#addRoundLink", :as => :addRoundLink
注意:我包括与“comps”相关的其他2行,以防万一会引起问题。
comps_controller.rb:
def addRoundLink
respond_to do |format|
format.js
end
end
comps_helper.rb:
def addRound
render "add_round"
end
addRoundLink.js.erb:
$("#some_id").html(<%=j addRound %>);
谱曲/ new.html.erb:
<%= link_to "render it!", addRoundLink_path, remote: true %>
<div id="some_id"></div>
感谢。
原始问题
首先,我是铁杆新手。我已经阅读并尝试了许多类似问题的解决方案,但到目前为止还没有任何工作。
我使用rails form_for和fields_for创建了一个表单。该表格创造了一个新的竞争(comp)。比赛有很多轮。表单的上半部分(form_for部分)接受有关竞争的详细信息作为输入,表单的下半部分接受有关每轮的详细信息(fields_for部分)。该表单以这种基本格式完美运行。
我获取了fields_for部分中的所有代码并将其放入部分代码中。我的计划是在表单底部创建一个“添加新轮”链接,每次按下链接时,只需在链接上方显示部分内容。这将为新一轮的表单添加一个新部分,并允许用户输入任意数量的轮次。这是我努力工作的部分。
我将此代码添加到我的comps_helper:
def addNewRound
render "add_round"
end
这将呈现文件/views/comps/_add_round.html.erb。
我的问题是:如何在单击链接时在表单中呈现此内容。据我所知,我所做的研究是:
<%= link_to "Add new round", { }, :remote => true %>
我并不完全知道将执行addNewRound方法的{}中的内容。而且我不知道我需要添加到comps_controller文件中的内容。
非常感谢您的帮助。
答案 0 :(得分:2)
您必须在控制器中创建一个动作
应用/控制器/ some_controller.rb 强>
def hello
respond_to do |format|
format.js
end
end
并定义此操作的路线。
<强>的routes.rb 强>
get "/hello" => "some#hello", :as => :hello
然后创建一个指向此操作的链接:
<%= link_to "render it!", hello_path, remote: true %>
<div id="some_id"></div>
当你点击这个链接时,它会找到你的行动方式,并用js(javascript)回应,因为我们告诉行动只回应js。
最后将部分渲染到视图中的任何位置(*在此示例中为* some_id div *)
应用/视图/一些/ hello.js.erb 强>
$("#some_id").html("<%=j addNewRound %>");
警告:创建动态表单很痛苦。您将面临许多问题(例如为新表单元素设置不同的ID等等)。我强烈建议你使用ryan bates nested_form gem