Я создал кнопку общего доступа с 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.