【问题标题】:Add section to form by rendering a partial when link is clicked通过单击链接时呈现部分来将部分添加到表单
【发布时间】:2012-09-10 20:32:10
【问题描述】:

更新 3:

对于阅读本文的任何人,这就是为什么它在下面的更新 2 中没有按预期工作:Passing a local variable to a partial that is rendered after the view has already loaded

如果有人知道如何解决这个问题,请告诉我。

更新 2:

我用引号更新了 javascript,它部分工作......从某种意义上说,javascript 现在可以正常工作,只要我点击链接,它就会导致页面上出现一串文本部分只包含一串文本。但是,当部分包含表单字段代码时,就会出现问题。

如果我只是将以下渲染代码直接粘贴到 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 %>);

comps/new.html.erb:

<%= link_to "render it!", addRoundLink_path, remote: true %>
<div id="some_id"></div>

谢谢。

原始问题

首先,我是 Rails 新手。我已经阅读并尝试了许多类似问题的解决方案,但到目前为止没有任何效果。

我用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 文件中。

非常感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2


    【解决方案1】:

    你必须在你的控制器中创建一个动作

    app/controllers/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*)

    app/views/some/hello.js.erb

    $("#some_id").html("<%=j addNewRound %>");
    

    警告:创建动态表单很痛苦。您将面临很多问题(例如为新的表单元素设置不同的 id 等...)。我强烈推荐你使用 ryan bates nested_form gem

    【讨论】:

    • 感谢您的回复。我根据您的建议所做的更改更新了我原来的问题,但它仍然无法正常工作。我还缺少什么?非常感谢帮忙。 (我会尽快查看nested_form!)。
    • 您是否将 jquery 和 jquery_ujs 添加到您的 application.js 中?
    • 这是否意味着它们被添加了?: //= 需要 jquery //= 需要 jquery_ujs //= 需要_树。
    • 我在 hello.js.erb 中添加了引号。在 周围添加。是的,您正确添加了它们。
    • Emrah,非常感谢。它仍然无法正常工作。如果可以的话,请看看我上面的更新,让我知道你的想法。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多