Разрешить пользователю заполнить форму с задержкой, error: undefined метод `errors 'для nil: NilClass - PullRequest
1 голос
/ 23 января 2020

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

Вот что я делаю в своей контроллер:

class EmailsController < ApplicationController

  def index
    redirect_to root_path
  end

  def new
    @email = Email.new
  end

  def create
    if Time.now - Email.last.created_at < 100
      respond_to do |format|
        format.html{render :new, notice: "Wait !"}
      end
    else
      respond_to do |format|
        @email = Email.create(email_params)
        if@email.persisted?
          format.html {redirect_to invoice_index_path, notice: 'Email validated '}
        else
          format.html{render :new}
        end
      end
    end
  end

личный

def email_params params.require (: электронная почта) .permit (: электронная почта,: id_user) end end

Мой взгляд:

   <div class="container">
<% if flash[:notice].present?%>
    <center><p id="notice" class="alert alert-success"><%= flash[:notice] %></p></center>
<%end%>
<center><h1>Nouvelle Connection </h1></center>
    <%= form_with model: @email, local: true do |form|%>
        <% if @email.errors.any? %>
        <div id="error explanation" class="alert alert-danger">
            <p>Erreur(s) : </p>
                <ul>
                    <% @email.errors.full_messages.each do |message|%>
                        <li><%=message%></li>
                    <% end %>
                </ul>
        </div>
        <% end %>
        <div class="form-group">
            <%= label_tag :email %> :
            <%= form.email_field :email, placeholder: "Insérez votre email", class: "form-control" %>
        </div>
        <div class="form-group">
        <%= form.submit class: "btn btn-primary btn-lg btn-block", value: "Se connecter" %>
        </div>
    <%end%>
</div>

Когда я заполняю форму, ничего не происходит, просто URL-адрес меняется с http://localhost:3000/ на http://localhost:3000/emails, и когда я снова нажимаю на Validate, он переходит на http://localhost:3000/emails/53 с ошибкой The action 'update' could not be found for EmailsController, но я думаю, у меня есть эта ошибка, потому что у меня нет обновления / редактирования в моем контроллере.

Вы знаете, как это исправить, чтобы позволить мне задержку между каждым пользователем?

Редактировать: у меня теперь ошибка undefined method errors for nil:NilClass в моем представлении в строке <% if @email.errors.any? %>. Я понимаю, что это потому, что мой @email равен nil, но я пытался интегрировать это в моем представлении:

<% if @email.nil?%>
 <%= Wait for the moment %>
<%end%>

Также пытался: <% if @email&.errors&.any? %> почему так, я возвращаюсь к URL: http://localhost:3000/emails Но все еще есть та же ошибка, вы знаете, как это исправить?

1 Ответ

0 голосов
/ 23 января 2020

Прежде всего, по вашему мнению, вы проверяете на notice.present?, и это должно быть flash[:notice].present?. Так что ошибка будет показана.

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

Поэтому вместо этого сделайте что-то вроде:

def create
  if Time.now - Email.last.created_at < 100
    respond_to do |format|
      @email = Email.new(email_params)
      format.html do
        flash[:notice] = 'Wait! You cannot enter emails so quickly!' 
        render :new
      end 
    end
  else
    respond_to do |format|
      @email = Email.create(email_params)
      if @email.persisted?
        format.html {redirect_to invoice_index_path, notice: 'Email validé '}
      else
        format.html{render :new}
      end
    end
  end
end

Во-вторых, это означает, что любой пользователь, желающий ввести новое электронное письмо, будет наказан, если другой пользователь также введет другое электронное письмо. Таким образом, в этом случае вы можете проверить следующее:

Email.where(created_by_id: current_user.id).last 

, чтобы проверить только на наличие Email текущего пользователя (но, может быть, это слишком далеко заходит над вашей проблемой / решением?).

Также обратите внимание, что есть гораздо лучшие / эффективные способы регулирования запросов (ограничения скорости) с использованием apache / nginx (что, вероятно, и будет использовано), так что это действительно хороший подход для обработки в вашем ruby на коде рельсов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...