如何使用 AJAX、嵌套属性和 Rails 4 中的 jQuery 修复我的创建操作?

How could I fix my create action, using AJAX, nested attributes and jQuery in Rails 4?

我设法在 Rails 中使用 AJAX 和 jQuery 陷入了一个非常愚蠢的境地 4. 我正在使用嵌套属性,目前正在尝试通过以下方式执行创建操作AJAX。

通过以下设置,我可以通过 AJAX 创建一个新想法,但它会在每个项目上显示该想法。当我重新加载页面时,它只正确显示每个项目的给定想法,但 AJAX 视图首先是不正确的。

这是我的项目index.html.erb视图:

 <% @projects.each do |project| %>

    <p><%= project.name %></p>

    <ul class="postis">
        <%= render partial: "idea", collection: project.ideas %>
    </ul>

    <%= form_for([project, project.ideas.build], remote: true) do |f| %>
       <p><%= f.text_area :description %></p>
       <p><%= button_tag '', :class => 'glyphicon glyphicon-ok' %></p>
    <% end %>
 <% end %>

_idea.html.erb 项目视图文件夹下的部分:

       <li><%= idea.description %></li>  

我在 Ideas 视图文件夹下也有一个 _silly.html.erb 部分:

       <li><%= @idea.description %></li>  

ideas_controller.rb

def create
    @idea = @project.ideas.new(idea_params)
    respond_to do |format|
        if @idea.save
            format.html {redirect_to root_path}
            format.js
        else
            render.html {render :new}
            render.js
        end
    end
end

Routes.rb

resources :projects do
   resources :ideas 
 end

这是我的 Create.js.erb.

$('.postis').append("<%= j render("silly") %>")
$(":input:not(input[type=submit])").val("");

我的projects_controller.rb索引是:

 def index
    @projects = Project.all
 end

我尝试了一些选项,例如,如果我尝试在 Create.js.erb 中呈现部分想法,例如:

$('.postis').append("<%= j render("projects/idea") %>")
$(":input:not(input[type=submit])").val("");

我得到一个错误:"ActionView::Template::Error (undefined local variable or method 'idea'"

我怎样才能摆脱其他部分并使创建操作与 AJAX 一起工作?

_idea.html.erb 部分使用 idea 变量,您必须在 create.js.erb 文件中分配该变量:

$('.postis').append("<%= j render("projects/idea", idea: @idea) %>")

编辑:

要将创建的想法附加到更正的想法列表中,请将 project_id 添加到 <ul> 元素:

<ul id="<%= dom_id(project) %>" class="postis">
  <%= render project.ideas  %> <!-- shortcut for your code -->
</ul>

并再次修改 create.js.erb 文件,现在使用 id 而不是 class:

$('#<%= dom_id(@idea.project)%>').append("<%= j render("projects/idea", idea: @idea) %>")