Application ControllerSo zeigen Sie die Flash-Nachricht von before_action filter authenticate_user! auf einer Aktion, die durch Ajax
class ApplicationController < ActionController::Base
before_action :authenticate_user!, only: [:edit, :update, :destroy, :vote], not`enter code here`ice: "you must logged in first!!!"
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up) do |user_params|
user_params.permit(:name, :email, :password,
:password_confirmation, :avatar)
end
devise_parameter_sanitizer.permit(:account_update) do |user_params|
user_params.permit(:name, :email, :password,
:password_confirmation, :current_password, :remove_avatar, :avatar)
end
end
end
Und hier ist die post controller
, in der Abstimmung Methode von Ajax aufgerufen wird aufgerufen:
Beiträge Controllers
class PostsController < ApplicationController
def index
if params[:search]
@posts = Post.search(params[:search]).order("created_at ASC")
else
@posts = Post.all.order('created_at ASC')
end
end
def show_all_post_of_current_user
@current_user_posts = current_user.posts.all
end
def show
@post = Post.find(params[:id])
end
def vote
@post = Post.find(params[:id])
@vote = @post.votes.new :user_id => current_user.id, :vote => params[:vote]
@vote.save
respond_to do |format|
format.html do
if @vote.valid?
flash[:notice] = 'Thanks for voting.'
else
flash[:error] = 'You can only vote on a post once.'
end
redirect_to :back
end
format.js
end
end
def new
@post = current_user.posts.build
end
def display_post_of_current_user
@display = current_user.posts.find(params[:id])
end
def edit
@post = current_user.posts.find(params[:id])
end
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to display_post_path(@post)
else
render 'new'
end
end
def update
@post = current_user.posts.find(params[:id])
if @post.update(edit_post_params)
redirect_to display_post_path(@post)
flash[:success] = "Post updated successfully"
else
render 'edit'
end
end
def destroy
@post = current_user.posts.find(params[:id])
@post.destroy
redirect_to post_path
flash[:success] = "Post deleted successfully"
end
private
def post_params
params.require(:post).permit(:title, :description, :date, :category, :picture)
end
def edit_post_params
params.require(:post).permit(:title, :description)
end
end
Anzeigen
<h1>Post Description</h1>
<p>
Submitted <%= time_ago_in_words(@post.created_at) %>
by <%= @post.user.email %>
</p>
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<p>
<strong>Description:</strong>
<%= @post.description %>
</p>
<p>
<%= link_to vote_post_path(@post, vote: true), method: 'post', remote: true do %>
<span> Up </span> | <span id='post_<%[email protected]%>_votes'><%= @post.up_votes %></span>
<%end %>
<%= link_to vote_post_path(@post, vote: false), method: 'post', remote: true do %>
<span> Down </span> | <span id='post_<%[email protected]%>_votes'><%= @post.down_votes %></span>
<%end %>
<span id='post_<%[email protected]%>_votes'><%= @post.total_votes %> votes</span> |
<%= link_to "Back", posts_path %>
</p>
vote.js.erb
<% if @vote.valid? %>
$("#post_<%= @post.id %>_votes").html("<%= @post.total_votes %> votes")
$("#post_<%= @post.id %>up_votes").html("<%= @post.up_votes %>")
$("#post_<%= @post.id %>down_votes").html("<%= @post.down_votes %>")
<% else %>
alert('You can only vote on a post once.');
<% end %>
Während Benutzer klicken Sie auf upvote oder downvote Link ein Ajax auf Abstimmung Methode der Post-Controller genannt wird. und ein Filter auf der Anwendungssteuereinheit schränkt den Benutzer ein, um eine Abstimmung durchzuführen, bis der Benutzer logged_in, den ich benutze, vor dem Filter zum Authentifizieren der Benutzermethode der Erfindung arbeitet. Aber ich weiß nicht, wie man Flash generiert, während der Benutzer auf Upvote oder Downvote klickt.
Ich habe versucht, mit dieser seine nicht funktioniert .. – Divya
ant andere Lösung für dieses .. ??? – Divya
@Divya PLZ überprüfen aktualisierte Antwort – Arvind