如何在 Rails 4 中使用 AJAX 和 jQuery 创建操作,当使用嵌套属性时?

How to make create action work with AJAX and jQuery in Rails 4, when using nested attributes?

我正在尝试学习如何在 Rails 中使用 AJAX 和 jQuery 4. 我正在使用嵌套属性,目前正在尝试通过 AJAX.

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

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

    ...

    <%= render "idea" %>

    <%= 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部分:

 <ul class="post">
   <% project.ideas.each do |idea| %>
       <li><%= idea.description %></li>  
   <% end %>
 </ul>

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。

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

使用此设置,我在 Projects#index,"undefined local variable or method 'project'" 中遇到了 NameError。 但是,如果我将部分更改为 <%= @project.ideas.each ... 我在 Projects#index.

中收到 "undefined method 'ideas'" 错误

我的projects_controller.rb索引是:

 def index
    @projects = Project.all
 end

我对如何正确渲染 'idea' 部分感到困惑?

您得到的错误是因为您根本没有定义 @project,而 project 仅在索引视图的 @projects.each 块内定义。您可以将 project 变量作为局部变量传递给 idea 部分,如下所示:

<%= render partial: "idea", locals:  {project: project} %> 

但更好的是,您可以将想法呈现为集合,如下所示:

在索引视图中:

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

现在我们有了 'project' 变量,因为我们在 @projects.each 块中。

并在想法部分:

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