2016-12-22 2 views
0

Я хочу ограничить посетителя отправкой формы более одного раза, и единственный способ сделать это, как я думаю, - это файлы cookie. В моем контроллере я создаю печенье:Ограничить посетителя отправьте форму, если она уже была отправлена ​​им

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 

формы, я использую - это представление, нажав на звездочке (это рейтинг 5 звезд, и я использую ajax представить его). И теперь, как ограничить посетителя отправкой формы снова, используя этот файл cookie? Первая идея заключалась в том, чтобы добавить столбец в db и сохранить там файл cookie, а затем использовать проверку, чтобы проверить уникальность файла cookie, но я не знаю, если это хорошая идея.

ответ

1

Проблема использования файлов cookie для такой проверки заключается в том, что пользователь, если он действительно хочет проголосовать снова, может сбросить файлы cookie на своем компьютере или даже если ваш пользователь проголосовал неделю назад и не помнит что он проголосовал, и он находится в другом браузере, он не увидит своего голоса.

Итак, если у вас есть пользователи, я имею в виду, что они вошли в систему, и у вас есть доступ к пользователю, вы можете создать новую модель под названием usersVote, чтобы вы могли хранить идентификатор пользователя и casino_id и оценку, это было бы что-то вроде этого.

class CreateUsersVote < ActiveRecord::Migration 
    def up 
     create_table :users_vote do |t| 
      t.integer 'score', null:false 
      t.references :user, null:false 
      t.references :casino, null:false 
     end 
    end 

    def down 
     drop_table :users_vote 
    end 
end 

Так что если пользователь снова отправляется с любого компьютера, в котором он находится, вы позаботитесь об этом.

EDIT: Если нет пользователя, единственный способ подтвердить, что этот пользователь будет использовать файлы cookie, как вы сказали, но вам не нужно будет привлекать рельсы или базу данных к этой задаче, поскольку вы не сможете проверить что-либо если пользователь изменит свой куки, как я уже говорил выше, так как вы могли бы сделать это только с помощью JQuery:

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

вы бы положить, что на вашем АЯКС представления и если пользователь вновь представить вам помешали бы ему завершение заполнения :

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

Приложение не имеет пользователей, которые могут выполнить вход. –

0

один из способов сделать это, чтобы добавить логический столбец submitted на вашем ratings таблице

migraion

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

пробег bundle exec rake db:migrate

то в вашей Rating модели

class Rating < ActiveRecord::Base 

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

end 

Затем в своем действии контроллера AJAX, вы можете сделать что-то вроде

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 

Затем на вашем блоке успеха AJAX, вы можете

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

Таким образом, представление формы не только сохранялось, что AJAX вызова, но и сохранить в базе данных. В следующий раз, когда пользователь зайдет на эту страницу, чтобы повторно отправить, вы можете вытащить рейтинг пользователя из базы данных и проверить флаг submitted, если пользователь уже отправил или не использовал его в вашем файле вида, чтобы добавить блок if, чтобы скрыть кнопка.

Смежные вопросы