2016-07-28 6 views
2

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.

Antwort

2

Sie können eine Flash-Nachricht in Ihrer js.erb-Datei aufrufen, die Sie anrufen, wenn der Benutzer auf die Abstimmung klickt.

vote.js.erb

<%= flash[:notice] %> 

Sie müssen Sie Ihr respond_to Block

respond_to do |format| 
    if @vote.valid? 
    format.html { flash[:notice] = 'Thanks for voting.' } 
    format.js { flash[:notice] = 'Thanks for voting.' } 
    else 
    format.html { flash[:error] = 'You can only vote on a post once.'} 
    format.js { flash[:error] = 'You can only vote on a post once.'} 
    end 
end 

es auch Ihnen helfen form_with_ajax

aktualisieren Sie tun könnte sich ändern müssen dein eigener authenticate_user! Aktion und in dieser Aktion können Sie das gewünschte Verhalten haben. setzen Nachricht, was Sie auf js Datei wollen

def authenticate_user! 
    unless current_user 
    render 'yourjs' 
    end 
end 
+0

Ich habe versucht, mit dieser seine nicht funktioniert .. – Divya

+0

ant andere Lösung für dieses .. ??? – Divya

+0

@Divya PLZ überprüfen aktualisierte Antwort – Arvind

Verwandte Themen