2015-12-31 5 views
0

Я довольно новичок в Rails и пытаюсь обновить элемент «веха» в своем приложении с помощью AJAX. Вехи принадлежат проектам. Мне удалось успешно выполнить AJAX-запросы для создания и удаления, но я столкнулся с проблемами при обновлении.Rails Ajax завершено 200 OK, но запись не обновляется

Когда я отправляю форму, она говорит, что она была обработана с помощью MilestonesController # update как JS со статусом Completed 200 OK и create.js.erb, но эта веха фактически не обновляется.

Вот соответствующие файлы, дайте мне знать, если я могу предоставить любой дополнительный контекст и заблаговременно за любую помощь, которую вы можете предложить!

От терминала, после проверки флажок, чтобы обновить завершено, чтобы быть правдой:

Started PATCH "/projects/clustertruck-branding-design-and-development/milestones/24" for 127.0.0.1 at 2015-12-31 16:12:04 -0500 
Processing by MilestonesController#update as JS 
Parameters: {"utf8"=>"✓", "milestone"=>{"project_id"=>"7", "completed"=>"true", "completed_date"=>"2015-12-31"}, "commit"=>"✓", "project_id"=>"clustertruck-branding-design-and-development", "id"=>"24"} 
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
Project Load (0.1ms) SELECT "projects".* FROM "projects" WHERE "projects"."slug" = 'clustertruck-branding-design-and-development' ORDER BY "projects"."id" ASC LIMIT 1 
Milestone Load (0.1ms) SELECT "milestones".* FROM "milestones" WHERE "milestones"."project_id" = ? AND "milestones"."id" = ? LIMIT 1 [["project_id", 7], ["id", 24]] 
ActsAsTaggableOn::Tag Load (0.1ms) SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = ? AND "taggings"."taggable_type" = ? AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL) [["taggable_id", 24], ["taggable_type", "Milestone"]] 
    Rendered milestones/_milestone.html.erb (7.2ms) 
    Rendered milestones/update.js.erb (11.3ms) 
Completed 200 OK in 18ms (Views: 14.7ms | ActiveRecord: 0.3ms) 

routes.rb

get 'tags/:tag', to: 'milestones#index', as: :tag 

root :to => "projects#index" 
resources :memberships 
resources :projects do 
    resources :milestones 
end 

update.js.erb

<% if @milestone.valid? %> 
    $('li#milestone-<%= @milestone.id %>').first().after("<%= j render @milestone %>"); 
    $('li#milestone-<%= @milestone.id %>').first().remove(); 
    $('li#month-marker-<%= @milestone.id %>').hide(); 
    $('li#month-marker-<%= @milestone.id %>').first().show(); 
    $(".modal").modal("hide"); 
    $("body").removeClass("modal-open"); 
    $(".modal-backdrop").remove(); 
<% else %> 
    alert("<%= @milestone.errors.full_messages.join(', ').html_safe %>"); 
<% end %> 

milestones_controller.rb класс MilestonesController < ApplicationController

before_action :require_user, only: [:index, :show] 
    before_action :require_editor, only: [:new, :create, :edit, :update, :destroy] 
    before_filter :load_project 
    before_filter :load_milestone, only: [:show, :edit, :update, :destroy] 

    def index 
    @milestones = Milestone.all 
    end 

    def show 
    end 

    def edit 
    end 

    def update 
    end 

    def new 
    @milestone = Milestone.new 
    end 

    def create 
    @milestone = Milestone.new(milestone_params) 
    @milestone.save 
    end 

    def destroy 
    @milestone.destroy 
    end 

    private 
    def milestone_params 
     params.require(:milestone).permit(:name, :description, :completed, :date, :completed, :completed_date, :project_id, :tag_list) 
    end 

    def load_project 
     @project = Project.friendly.find(params[:project_id]) 
    end 

    def load_milestone 
     @milestone = @project.milestones.find(params[:id]) 
    end 

end 

_milestone.html.erb

<% if @monthmarker != milestone.date.strftime("%B") %> 
    <% @monthmarker = milestone.date.strftime("%B") %> 
    <li class="month-marker" id="month-marker-<%= milestone.id %>"><%= @monthmarker %></li> 
<% end %> 

<% completion_classes = "" 
completion_classes << " complete" if milestone.milestone_complete? 
completion_classes << " incomplete" if milestone.milestone_incomplete? 
completion_classes << " overdue" if milestone.milestone_overdue? 
%> 
<li id="milestone-<%= milestone.id %>" class="card timeline-card<%= completion_classes %>"> 
    <div class="assignment-bubble"> 
    <% if milestone %> 
    <% else %> 
    <% end %> 
    </div> 
    <div class="card-header"> 
    <% if current_user && current_user.editor? %> 
     <a href="#" class="card-header-edit-link" data-toggle="modal" data-target="#edit-milestone-modal-<%= milestone.id %>">Edit</a> 
    <% end %> 
    <% if milestone.date.present? && !milestone.completed %> 
     Due: <%= milestone.date.strftime("%A, %B %d, %Y") %> 
    <% end %> 
    <% if milestone.completed && milestone.completed_date.present? %> 
     Completed: <%= milestone.completed_date.strftime("%A, %B %d, %Y") %> 
    <% end %> 
    </div> 
    <div class="card-body"> 
    <% if current_user && current_user.editor? %> 
     <% if milestone.completed %> 
     <%= form_for [milestone.project,milestone], :remote => true do |f| %> 
      <%= f.hidden_field(:project_id) %> 
      <%= f.hidden_field(:completed, value: false) %> 
      <%= f.submit "✓", :class => "status-checkbox #{completion_classes} mark-complete" %> 
     <% end %> 
     <% else %> 
     <%= form_for [milestone.project,milestone], :remote => true do |f| %> 
      <%= f.hidden_field(:project_id) %> 
      <%= f.hidden_field(:completed, value: true) %> 
      <%= f.hidden_field(:completed_date, value: Date.current) %> 
      <%= f.submit "✓", :class => "status-checkbox #{completion_classes} mark-complete" %> 
     <% end %> 
     <% end %> 
    <% else %> 
     <div class="status-checkbox view-only-status<%= completion_classes %>">✓</div> 
    <% end %> 
    <h3 class="name"><%= milestone.name %></h3> 
    <p class="description"><%= milestone.description %></p> 
    <% if milestone.tag_list.present? %> 
     <ul class="tags"> 
     <li class="tag"><%= raw milestone.tag_list.map { |t| link_to t, tag_path(t) }.join('</li><li class="tag">') %></li> 
     </ul> 
    <% end %> 
    </div> 

    <div class="modal fade" id="edit-milestone-modal-<%= milestone.id %>" tabindex="-1" role="dialog" aria-labelledby="milestoneModalLabel"> 
    <%= form_for [milestone.project,milestone], :remote => true do |f| %> 
     <div class="modal-dialog" role="document"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
      <button type="button" class="modal-close-btn" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
      <h4 class="modal-title" id="milestoneModalLabel">Edit Milestone</h4> 
      </div> 
      <div class="modal-body"> 
      <% flash.each do |key, value| %> 
       <div class="alert alert-<%= key %>"><%= value %></div> 
      <% end %> 
      <div class="field"> 
       <%= f.label :milestone %> 
       <%= f.text_field :name, :required => true %> 
      </div> 
      <div class="field"> 
       <%= f.label :description %> 
       <%= f.text_area :description, :required => true %> 
      </div> 
      <div class="field"> 
       <%= f.label :date %> 
       <%= f.date_field :date, "data-format" => "MM/dd/yyyy", :required => true %> 
      </div> 
      <div class="field"> 
       <%= f.label :completed %> 
       <%= f.select :completed, options_for_select([['Incomplete' ,''], ['Complete', true]], milestone.completed), :required => true %> 
      </div> 
      <div class="field"> 
       <%= f.label :completed_date %> 
       <%= f.date_field :completed_date, "data-format" => "MM/dd/yyyy" %> 
      </div> 
      <div class="field"> 
       <%= f.label :tag_list, "Tags (separated by commas)" %> 
       <%= f.text_field :tag_list %> 
      </div> 
      </div> 
      <div class="modal-footer"> 
      <% if current_user && current_user.editor? %> 
       <%= link_to [milestone.project,milestone], method: :delete, data: { confirm: 'Are you sure you want to delete this milestone?' }, :class => "btn btn-delete", :remote => true do %>Delete Milestone<% end %> 
      <% end %> 
      <%= f.submit "Save Milestone", :class => "btn btn-primary" %> 
      </div> 
     </div> 
     </div> 
    <% end %> 
    </div> 

</li> 
+3

но ... нет никакого кода в вашем 'update' метод? Как вы ожидаете, что запись будет обновлена? –

+0

похоже, что вы не внедрили действие обновления _and_, не вызывайте его. вероятно, вы вызываете создание дважды на той же вехе, что говорит файл журнала для вашей среды? – benjamin

ответ

1

Измените метод обновления на следующее:

def update 
    @milestone.update_attributes(milestone_params) 
end 

Сейчас ваш метод обновления не имеет никакой логики, поэтому он показывает хорошо и агрузка вехи/редакторы, но на самом деле ничего не происходит.

Вы также должны смотреть, чтобы развернуть его в будущем, как так:

respond_to do |format| 
    if @milestone.update_attributes(milestone_params) 
    format.js {} #this simply display your javascript 
    else 
    # Insert some kind of logic here where it displays errors 
    end 
end 
+0

Спасибо, Alexandre! Это именно то, что было. Цените помощь! – KilgoreTrout

Смежные вопросы