Как я могу исправить действие создания, используя AJAX, вложенные атрибуты и jQuery в Rails 4?

Мне удалось запутаться в действительно глупой ситуации, используя AJAX и jQuery в Rails 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 partial в папке просмотра проектов:

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

У меня также есть партиал _silly.html.erb в папке просмотра идей:

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

idea_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

Маршруты.рб

resources :projects do
   resources :ideas 
 end

Вот мой Create.js.erb.

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

Мой индекс project_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 (неопределенная локальная переменная или метод "идея""

Как я могу избавиться от другого частичного и заставить действие создания работать с AJAX?


person userden    schedule 19.01.2015    source источник
comment
Вы пробовали это, поместив его в одинарную кавычку 'projects/idea' ?   -  person Amit Sharma    schedule 19.01.2015


Ответы (1)


Партиал _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) %>")
person Rodrigo    schedule 19.01.2015
comment
Это почти работает, но по-прежнему отображает идею каждого проекта в пользовательском интерфейсе. Когда я перезагружаю страницу вручную, она отображается правильно. Вот что показывает сервер Rails: Запущен POST /projects/42/ideas Обработка с помощью IdeasController#create as JS ... Визуализированные проекты/_idea.html.erb (1,0 мс) Визуализированные идеи/create.js.erb (1,6 мс) Завершено 200 ОК - person userden; 19.01.2015
comment
Но мне удалось избавиться от другого частичного _silly.html.erb, так что +1 за это! :) Но все же меня смущает, почему идея отображается изначально на каждом проекте. - person userden; 19.01.2015