Почему я получаю ActionView :: Template :: Error Для моего переключателя AJAX не найдено ни одного маршрута?Рельсы 5.2 - PullRequest
0 голосов
/ 09 февраля 2019

Я создал кнопку общего доступа с AJAX, которая меняет состояние и считает, когда пользователь нажимает на нее.Кнопка AJAX находится внутри частичного элемента _share.html.erb , я вызываю частичный элемент внутри каждого блока для всех сообщений и отдельных сообщений.Я создал поддерживающий share.js.erb , который меняет кнопки внутри партиала при нажатии любой из них.У меня есть два действия в пост-контроллере share [POST] / unshare [DESTROY] .Как правильно настроить кнопку-переключатель AJAX для правильного отображения и изменения состояния?

Я попытался изменить переменные, передаваемые в представление, на переменные экземпляра в файлах share.js.erb и _share_post_btn.html..erb частичный.Я также внес изменения в действия в контроллере.Я все еще не получаю ни одного совпадения маршрутов, когда я нажимаю кнопку.

Ошибка ниже:

ActionView::Template::Error (No route matches {:action=>"unshare", :controller=>"posts", :id=>#<Post id: nil, body_text: nil, photo: nil, user_id: nil, created_at: nil, updated_at: nil, post_id: nil, original_post_id: 0, posts_counter: 0, cached_votes_total: 0, cached_votes_score: 0, cached_votes_up: 0, cached_votes_down: 0, cached_weighted_score: 0, cached_weighted_total: 0, cached_weighted_average: 0.0, impressions_count: nil, hash_id: nil, posts_count: nil>, :on=>:collection}, possible unmatched constraints: [:id]):
1: <li id="#share_<%= @post.id %>">
2:   <% if current_user.shared?(@post) %>
3:     <%= link_to unshare_post_path(@post), method: :destroy, remote: true, style: 'text-decoration: none;' do %>
4:       <i class="fas fa-share-square fa-2x post-charm-bar-icon-color"></i>
5:     <% end %>
6:   <% else %>

ОБНОВЛЕНИЕ 1: ОШИБКА 2 БЕЗ ЧАСТИЧНОГО

Started POST "/posts/6/share" for 127.0.0.1 at 2019-02-09 13:09:46 -0500
Processing by PostsController#share as JS
  Parameters: {"on"=>:collection, "id"=>"6"}
  User Load (7.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
   Post Load (18.0ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."hash_id" = $1 LIMIT $2  [["hash_id", "6"], ["LIMIT", 1]]
   Post Load (1.0ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2  [["id", 6], ["LIMIT", 1]]
   (5.0ms)  BEGIN
  Post Exists (4.0ms)  SELECT  1 AS one FROM "posts" WHERE "posts"."hash_id" = $1 LIMIT $2  [["hash_id", "Lbwmxf2zvU9S"], ["LIMIT", 1]]
  Post Create (50.0ms)  INSERT INTO "posts" ("user_id", "created_at", "updated_at", "original_post_id", "hash_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["user_id", 2], ["created_at", "2019-02-09 18:09:47.987106"], ["updated_at", "2019-02-09 18:09:47.987106"], ["original_post_id", 6], ["hash_id", "Lbwmxf2zvU9S"]]
  Post Load (1.0ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2  [["id", 6], ["LIMIT", 1]]
  Post Update All (2.0ms)  UPDATE "posts" SET "posts_count" = COALESCE("posts_count", 0) + 1 WHERE "posts"."id" = $1  [["id", 6]]
  (1.0ms)  ROLLBACK
Completed 500 Internal Server Error in 3666ms (ActiveRecord: 93.9ms)



NoMethodError (undefined method `scan' for nil:NilClass):

app/models/mention.rb:14:in `create_from_text'
app/models/post.rb:33:in `add_mentions'
app/controllers/posts_controller.rb:60:in `share'
Processing by ExceptionHandler::ExceptionsController#show as JS
  Parameters: {"on"=>:collection, "id"=>"6"}
Error during failsafe response: Could not render layout: undefined method `[]' for nil:NilClass

rout.rb

 resources :posts, on: :collection do
    member do
      post :share
      delete :unshare
    end
  end

posts_controller.rb

def share
  @post = current_user.posts.new(original_post_id: @post.id)
  if @post.save
    respond_to do |format|
      format.html {redirect_to :back}
      format.js {render action: "share"}
    end
  end
end

def unshare
  @post = current_user.posts.find(original_post_id: @post.id)
  respond_to do |format|
    if @post.destroy
      format.html {redirect_to :back}
      format.js {render action: "unshare"}
    end
  end
end

поделиться.js.erb

 $('#share_<%= @post.id%>').html('<%= escape_javascript(render :partial => "posts/share", :locals => {:post => @post}) %>');

unshare.js.erb

$('#share_<%= @post.id%>').html('<%= escape_javascript(render :partial => "posts/share", :locals => {:post => @post}) %>');

_share.html.erb

<li id="#share_<%= @post.id %>">
  <% if current_user.shared?(@post) %>
    <%= link_to unshare_post_path(@post), method: :destroy, remote: true, style: 'text-decoration: none;' do %>
  <i class="fas fa-share-square fa-2x post-charm-bar-icon-color"></i>
    <% end %>
  <% else %>
    <%= link_to share_post_path(@post.id), method: :post, remote: true, style: 'text-decoration: none;' do %>
  <i class="far fa-share-square fa-2x post-charm-bar-icon-color"></i>
    <% end %>
  <% end %>
</li>
<li id="#share_count-<%= @post.id %>">
  <small class="text-muted"><%= @post.posts_count ? number_to_human(@post.posts_count, :format => '%n%u', :precision => 2, :units => {:thousand => 'K', :million => 'M', :billion => 'B'}) : 0 %></small>
</li>

posts / _posts.html.erb

 <% @posts.each do |post| %>
    <div class="post_container">
     <%= render 'share', locale: post %>
    </div>
 <% end %>

Ожидаемые результаты : кнопка «Поделиться» должна изменять состояние, а значение posts_count должно увеличиваться / уменьшаться.

Фактические результаты : я получаю ActionViewTemplate :: Error, сообщающую, что ни один маршрут не соответствует unshare со всеми значениями nil для объекта Post.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Представление было двойным, представляя пост.В результате я переместил представления в отдельные части.

<% @posts.each do |post| %>
   <%= render partial: "posts/#{post.post_type}", locals: {post: post} %>
<% end %>
0 голосов
/ 09 февраля 2019

В настоящее время вы визуализируете партиал _share в партиале _posts, отправив

<%= render 'share', locale: post %>

Чтобы текущий объект публикации был доступен в шаблоне, вам нужно изменить его на

<%= render 'share', locals: { post: post } %>

как документация гласит .Текущий вызов метода просто предоставляет бесполезный и необработанный параметр с именем locale.

В отрисованном фрагменте локальная переменная будет доступна как post (без @).

Партиал _share, вероятно, использует некоторую переменную экземпляра, определенную в другом месте, которая только что была инициализирована, но он определенно не использует локальную переменную, указанную вами в _posts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...