Rails 4 ajax не отображает новые данные

#javascript #ruby-on-rails #ajax #ruby-on-rails-4

#javascript #ruby-on-rails #ajax #ruby-on-rails-4

Вопрос:

Я пытаюсь обновить свой div при отправке формы, но он не отображается с новыми данными.

в моем js:

 $('#myform').submit(function() {
  var valuesToSubmit = $(this).serialize();
  $(this).find('textarea').addClass('uneditable-input').attr('disabled', 'disabled');
  $.ajax({
    url: $(this).attr('action'), //sumbits it to the given url of the form
    data: valuesToSubmit,
    type: "POST",
    success: function(event, data, status, xhr){
      alert("hello");
      $('#indexstream').html("<%= j render :partial => 'post', :collection => @posts, :as => :post %>");
    }
  }).complete(function(){
    $("#disabletext").removeClass('uneditable-input').removeAttr('disabled', 'disabled').val('');
    $("#userlink").hide().show("slow").effect('highlight', {color: '#E5F2F7'}, 3000);
    $(function() {
      $("abbr.timeago").timeago();
    });
  });
  return false; // prevents normal behaviour 
});
 

контроллер сообщений:

 def create
  @post = Post.new(post_params)
  @post.email = current_user.username
  @post.user_id = current_user.id
  @post.firstname = current_user.firstname
  @post.lastname = current_user.lastname
  @post.avatar = current_user.avatar
  @post.school = current_user.school

  respond_to do |format|
    @search = Post.search do #Post.search do
      fulltext params[:search]
      with(:school, current_user.school)
    end

    @posts = @search.results
    if @post.save
      format.html { redirect_to posts_path, :notice => '<i class="fa fa-check fa-5x"></i>'.html_safe }
      format.json {render json: @post, status: :created, location: @post }
      # format.json { render action: 'index', status: :created, location: @post }

      puts "----------#{@posts.count}-------------"
      format.js { render :partial => 'post', :collection => @posts, :as => :post, :layout => false }
      # format.js {"$('#indexstream').replaceWith('<%= escape_javascript(render @post) %>');".html_safe}
      puts "-------------#{request.format}----------------"

    else
      format.html { render action: 'new' }
      format.json { render json: @post.errors, status: :unprocessable_entity }
      #format.js {alert("couldn't create post")}
    end
  end
end
 

моя форма в представлении:

 <%= form_for(Post.new, :html => {:id => "myform"}, :remote => true) do |f| %>

  <%= hidden_field_tag :user_id, current_user.id %>
  <%= f.hidden_field :price, :as => :hidden, :value => 0 %>
  <%= f.hidden_field :description, :as => :hidden, :value => "status" %>

  <div class="field" style="margin-top: -10px; color: #4AC948;">
    <h2 style="font-weight: bold; font-size: 180%;">status post:</h2>
    <%= f.text_area :title, :class => "fruute-input", :id => "disabletext", :size => 29, :autofocus => true, :style => "height: 60px; line-height: 1; width: 230px; " %>
  </div>
  <br/>
  <i class="fa fa-camera fa-2x"></i>(optional): <%= f.file_field :asset1 %>
  <hr/>
  <br/>
  <div class="actions">
    <%= button_tag(type: 'submit', class: "new-button2", style: "width: 242px; height: 50px; ") do %>
      submit
    <% end %>
  </div>
<% end %>
</div>
</div>
</div>
<% end %>
 

мой js работает, я получаю оповещения и в консоли, которую я получаю rendered posts/_post.html.erb , но на странице не отображаются новые данные, если я не обновлю вручную.

Есть ли у меня dea?

Спасибо

Вид

 <div id="indexstream">
  <%= render :partial => 'post' , :collection => @posts, :as => :post %>
</div>
 

Частичный:

 <div id="userlink">
  <%= image_tag post.avatar.url(:small), :style => "border-radius: 5px; border: 1px solid #e1e8ed;" %>
  <%= post.firstname %> <%= " " %>  <%= post.lastname %><%= " " %>  <%= link_to post.email, user_path(post.user_id), {class: "usernamelink", style: "font-weight: normal;"} %>

  <abbr class="timeago" title="<%= post.created_at.getutc.iso8601 %>" style="float: right; margin-right: 5px; font-size:90%;
      margin-top: 12px; color: #8899a6; text-decoration: none !important;">
    <%= post.created_at.to_s %>
  </abbr>

  <br/><br/>
  <% unless post.description == "status" %>
    <div style="background: #EF4836; width: 10px; height: 5px; float: right; margin-top: -58px; text-align: center; border-radius: 10px; color: #fff; padding-top: 2px; padding-bottom: 2px; margin-right: 5px;">
    </div>
    <h1 style="style= z-index: 100000; color: #3399FF "><%= link_to post.title, post_path(post), {class: "usernamelink", style: "color: #3399FF;"} %></h1>

    <% if post.asset1.file? %><%= image_tag post.asset1.url(:small) %>
    <% end %>
    <% if post.asset2.file? %><%= image_tag post.asset2.url(:small) %>
    <% end %>
    <% if post.asset3.file? %><%= image_tag post.asset3.url(:small) %>
    <% end %>
    <% if post.asset4.file? %><%= image_tag post.asset4.url(:small) %>
    <% end %>
    <br/><br/>
    <i class="fa fa-map-marker fa-lg" style="margin-right: 5px; margin-left: 5px;"></i>  <%= post.school %>
    <div style="float: right; text-align: left; margin-right: 20px;"><i class="fa fa-usd "></i><%= post.price %></div>

  <% end %>
  <% if post.description == "status" %>
    <div style="background: #2ECC71; width: 10px; height: 5px; float: right; margin-top: -58px; text-align: center; border-radius: 10px; color: #fff; padding-top: 2px; padding-bottom: 2px; margin-right: 5px;">

    </div>
    <h1><%= auto_link(post.title) %></h1>
 

Комментарии:

1. </div></div></div><% end %> я думаю, это бесполезно.

2. И вы puts в действии отлично работаете и показываете ..? Также вы не показали свой $('#indexstream') блок.

3. да, puts работает, собираюсь добавить поток индексов

Ответ №1:

Я вижу несколько способов сделать это. Ваше решение содержит 2. Сначала отправить данные с помощью ajax и установить с ним html:

 # create action
if @post.save
  format.html { redirect_to posts_path, :notice => '<i class="fa fa-check fa-5x"></i>'.html_safe }
  format.json {render json: @post, status: :created, location: @post }
  format.js { render :partial => 'post', :collection => @posts, :as => :post, :layout => false }

# js
success: function(event, data, status, xhr){
  alert("hello");
  $('#indexstream').html(data);
}
 

Во-вторых, отправлять данные и обновлять их через js:

 # js
success: function(event, data, status, xhr){
  alert("hello");
  console.log(status);
}

# create
format.js { "$('#indexstream').html("<%= j render :partial => 'post', :collection => @posts, :as => :post, :layout => false %>");".html_safe}
 

или создайте файл create.js.erb , в который вы можете поместить

 $('#indexstream').html('<%= j render :partial => "post", :collection => @posts, :as => :post, :layout => false %>');
alert("works!");
 

PS: возможно, проблема в одинарных кавычках 2 раза — $('#indexstream').html('<%= j render :partial => 'post', :collection => @posts, :as => :post, :layout => false %>');

Я думаю, что ‘post’ может быть изменен на :post

Надеюсь, это поможет.

Обновить

Попробуйте добавить @posts = @search.results после сохранения:

 @posts = @search.results
if @post.save
  @posts = @search.results
....
 

Комментарии:

1. оповещение ajax (данные) возвращает «успех», а также частичное

2. я думаю, я понял: вы делаете @posts = @search.results раньше @posr.save , поэтому результаты не содержат этого сообщения.

3. изменил его на after if @post.save, но все равно получаю «успех» в частичном тексте

4. Может быть, вы перепутали параметры, зарегистрируйте все успешно. И попробуйте вариант 3 с созданием js.erb файла

5. в create.js.erb оповещение работает, но частично возвращает текст «успех».

Ответ №2:

В контроллере пришлось изменить format.js чтобы

 Format.js { render @post }
 

В js

 Success: function(event)
       {
           $('#indexstream').prepend(event):

        }
 

И все это прекрасно работает