2016-12-22 6 views
0

Ich möchte einen Besucher beschränken, um das Formular mehr als einmal einzureichen, und die einzige Möglichkeit, das zu tun, wie ich denke, ist Cookies. In meinem Controller erstelle ich ein Cookie:Beschränken Sie einen Besucher senden Sie das Formular, wenn es bereits von ihm eingereicht wurde

class RatingsController < ApplicationController 
    require 'securerandom' 
    before_action :session_cookie 

    def create 
    @rating = Rating.new(rating_params) 
    @rating.save 
    render json: { rating: @rating.casino.average_rating.to_f.round(2) }, status: 200 
    end 

    private 

    def rating_params 
    params.require(:rating).permit(:score, :casino_id) 
    end 

    def session_cookie 
    cookies[:name] = { value: SecureRandom.base64, expires: Time.now + 3600} 
    end 

end 

Die Form, die ich verwende - einreicht, indem Sie auf einen Stern klicken (es ist ein 5-Sterne-Bewertung, und ich verwende ajax es einreichen). Und nun, wie kann man einen Besucher darauf beschränken, das Formular mit diesem Cookie erneut einzureichen? Die erste Idee war, eine Spalte zu db hinzuzufügen und dort ein Cookie zu speichern, und dann die Validierung zu verwenden, um die Eindeutigkeit von Cookies zu überprüfen, aber ich weiß nicht, ob dies eine gute Idee ist.

Antwort

1

Das Problem der Verwendung von Cookies, um diese Art von Validierung ist, dass der Benutzer, wenn er/sie will wirklich wieder abstimmen könnte er die Cookies auf seinem Computer zurücksetzen, oder auch wenn Ihr Benutzer vor einer Woche gewählt hat und nicht erinnern dass er gewählt hat und er in einem anderen Browser ist, wird er seine Stimme nicht sehen.

Also angenommen, Sie haben Benutzer, ich meine, sie sind angemeldet und Sie haben Zugriff auf den Benutzer, Sie könnten ein neues Modell namens usersVote erstellen, also würden Sie die Benutzer-ID und die casino_id und die Punktzahl speichern, wäre es etwas wie das.

Also, wenn der Benutzer erneut von welchem ​​Computer auch immer er eingereicht hat, würden Sie darauf achten.

EDIT: Also, wenn es keinen Benutzer gibt, die einzige Möglichkeit, diesen Benutzer zu validieren, wäre die Verwendung von Cookies, wie Sie sagten, aber Sie brauchen nicht Schienen oder die Datenbank für diese Aufgabe zu beteiligen, da Sie nichts validieren können wenn der Benutzer seine Cookies ändern, wie ich oben sagte, so wie Sie dies tun würde, ist nur mit jquery:

$.cookie("userHasVoted", 1, { expires : 10 }); 
//10 is the number of days when the cookie will expire 

Sie sich, dass auf dem ajax-Vorlage setzen und wenn der Benutzer erneut einreichen würden Sie ihn verhindern submiting :

if($.cookie("userHasVoted") == 1) { 
    alert("You have submited already"); 
    //prevent user from submiting 
} 
+0

Die App hat keine Benutzer, die sich anmelden können. –

0

eine Möglichkeit, dies zu tun, ist ein hinzufügen boolean Spalte submitted auf ratings Tisch

migraion

add_column :ratings, :submitted, :boolean, :default => false 

Lauf bundle exec rake db:migrate

dann in Ihrem Rating Modell

class Rating < ActiveRecord::Base 

    def submitted! 
     self.submitted = true 
     self.save 
    end 

end 

Dann in Ihrer AJAX Controller-Aktion, die Sie tun können etwas wie

class RatingsController < ApplicationController 

    def create 
    @rating = Rating.new(rating_params) 
    if @rating.save 
     @rating.submitted! 
     render json: { rating: @rating.casino.average_rating.to_f.round(2), submitted: true }, status: 200 
    else 
     render json: { errors: @rating.errors }, status: 422 
    end 
    end 

end 

dann auf AJAX Erfolg Block, können Sie

success: function(res, status, xhr) { 
    if (res.submitted == true) { 
     // hide or disable the button on your UI with jQuery/JS 
    } 
} 

diese Weise wird die Formulareinreichung nicht nur anhielt, dass AJAX-Aufruf, sondern auch in der Datenbank gepflegt. Wenn der Benutzer das nächste Mal diese Seite aufruft, um erneut zu senden, können Sie die Bewertung des Nutzers aus der db ziehen und das Flag submitted prüfen, wenn der Benutzer es bereits in Ihrer View-Datei eingegeben oder nicht hinzugefügt hat Taste.

Verwandte Themen