如何使用 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) %>")
我设法在 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) %>")