Ruby on rails 直接访问url是否具有与通过链接导航相同的效果?

Ruby on rails 直接访问url是否具有与通过链接导航相同的效果?,ruby-on-rails,ruby,ruby-on-rails-4,path,routes,Ruby On Rails,Ruby,Ruby On Rails 4,Path,Routes,我有一个记录用户ip地址的投票系统,用户只能投票一次。如果投票数组包含用户的ip地址,则不会向用户显示投票链接: show.html.erb <% if !ip_array.include? request.remote_ip %> <%= link_to "Vote!", vote_user_path(@user) %> <% else %> You've already voted! <% end %> def vote @use

我有一个记录用户ip地址的投票系统,用户只能投票一次。如果投票数组包含用户的ip地址,则不会向用户显示投票链接:

show.html.erb

<% if !ip_array.include? request.remote_ip %>
  <%= link_to "Vote!", vote_user_path(@user) %>
<% else %>
  You've already voted!
<% end %>
def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
end

但是用户不能直接访问
www.my_-website.com/users/:id/vote
来绕过这个问题吗?如果是这样,我如何防止这种情况发生?

防止这种情况的方法是将验证放在控制器操作中,而不是放在视图中(或附加在视图中)

before_action :ensure_not_voted

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
end

protected

def ensure_not_voted
  # perform the check and stop on failure
  # already_voted is a fake function, replace it with your real check
  if already_voted
    halt(403)
  end
end

防止这种情况发生的方法是将验证放在控制器操作中,而不是放在视图中(或附加在视图中)

before_action :ensure_not_voted

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
end

protected

def ensure_not_voted
  # perform the check and stop on failure
  # already_voted is a fake function, replace it with your real check
  if already_voted
    halt(403)
  end
end

防止这种情况发生的方法是将验证放在控制器操作中,而不是放在视图中(或附加在视图中)

before_action :ensure_not_voted

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
end

protected

def ensure_not_voted
  # perform the check and stop on failure
  # already_voted is a fake function, replace it with your real check
  if already_voted
    halt(403)
  end
end

防止这种情况发生的方法是将验证放在控制器操作中,而不是放在视图中(或附加在视图中)

before_action :ensure_not_voted

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
end

protected

def ensure_not_voted
  # perform the check and stop on failure
  # already_voted is a fake function, replace it with your real check
  if already_voted
    halt(403)
  end
end

对于更简单的解决方案,您可以向每个用户添加会话令牌,并检查ip是否包含特定令牌,如

在过滤器:auth,:only=>[:vote]之前添加一个

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
  session[:token] = request.remote_ip
end


private

  def auth
        @ip = session[:token].to_s

        if @ip != nil
            redirect_to :back
            flash[:notice] = "You have already voted"
            return false
        else
            return true
        end
  end

用户可以删除Cookie以再次投票(很少有人可以),在这种情况下,您可以将ip保存在db中并对照它进行检查

为了更简单的解决方案,您可以向每个用户添加会话令牌,并检查ip是否包含特定令牌,如

在过滤器:auth,:only=>[:vote]之前添加一个

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
  session[:token] = request.remote_ip
end


private

  def auth
        @ip = session[:token].to_s

        if @ip != nil
            redirect_to :back
            flash[:notice] = "You have already voted"
            return false
        else
            return true
        end
  end

用户可以删除Cookie以再次投票(很少有人可以),在这种情况下,您可以将ip保存在db中并对照它进行检查

为了更简单的解决方案,您可以向每个用户添加会话令牌,并检查ip是否包含特定令牌,如

在过滤器:auth,:only=>[:vote]之前添加一个

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
  session[:token] = request.remote_ip
end


private

  def auth
        @ip = session[:token].to_s

        if @ip != nil
            redirect_to :back
            flash[:notice] = "You have already voted"
            return false
        else
            return true
        end
  end

用户可以删除Cookie以再次投票(很少有人可以),在这种情况下,您可以将ip保存在db中并对照它进行检查

为了更简单的解决方案,您可以向每个用户添加会话令牌,并检查ip是否包含特定令牌,如

在过滤器:auth,:only=>[:vote]之前添加一个

def vote
  @user = User.find(params[:id])
  @user.votes = @user.votes + 1
  @user.save
  session[:token] = request.remote_ip
end


private

  def auth
        @ip = session[:token].to_s

        if @ip != nil
            redirect_to :back
            flash[:notice] = "You have already voted"
            return false
        else
            return true
        end
  end

用户可以删除Cookie以再次投票(很少有人可以),在这种情况下,您可以将ip保存在db中并对照它进行检查

我在哪里定义已投票?我没有一个网站的实际用户模型;我的用户模型引用了其他内容。如果需要,您需要移动
if!ip_数组。是否包括?请求。将远程ip
逻辑输入控制器。我不知道真正的代码是什么样子的,您的代码中没有足够的上下文来理解它。我应该在哪里定义它?我没有一个网站的实际用户模型;我的用户模型引用了其他内容。如果需要,您需要移动
if!ip_数组。是否包括?请求。将远程ip
逻辑输入控制器。我不知道真正的代码是什么样子的,您的代码中没有足够的上下文来理解它。我应该在哪里定义它?我没有一个网站的实际用户模型;我的用户模型引用了其他内容。如果需要,您需要移动
if!ip_数组。是否包括?请求。将远程ip
逻辑输入控制器。我不知道真正的代码是什么样子的,您的代码中没有足够的上下文来理解它。我应该在哪里定义它?我没有一个网站的实际用户模型;我的用户模型引用了其他内容。如果需要,您需要移动
if!ip_数组。是否包括?请求。将远程ip
逻辑输入控制器。我不知道真正的代码是什么样子的,您的代码中没有足够的上下文来理解它。