【问题标题】:How could I fix my create action, using AJAX, nested attributes and jQuery in Rails 4?如何在 Rails 4 中使用 AJAX、嵌套属性和 jQuery 修复我的创建操作?
【发布时间】:2015-03-17 11:12:30
【问题描述】:

我设法在 Rails 4 中使用 AJAX 和 jQuery 让自己陷入了一个非常愚蠢的境地。我正在使用嵌套属性,目前正在尝试通过 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 部分位于 Projects 视图文件夹下:

       <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(未定义的局部变量或方法'idea'”

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

【问题讨论】:

  • 你试过用单引号'projects/idea'吗?

标签: jquery ruby-on-rails ajax ruby-on-rails-4


【解决方案1】:

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

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

编辑:

要将创建的想法附加到正确的想法列表中,请将 project_id 添加到 &lt;ul&gt; 元素:

<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 服务器显示的: Started POST "/projects/42/ideas" Processing by IdeasController#create as JS ... Rendered projects/_idea.html.erb (1.0ms) Rendered ideas/create.js.erb (1.6ms) ) 完成 200 OK
  • 但我确实设法摆脱了其他部分 _silly.html.erb,所以 +1! :) 但我仍然很困惑为什么这个想法最初会显示在每个项目上。
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多