Проверка формы в рубине на рельсах - PullRequest
0 голосов
/ 05 ноября 2018

Я создал страницу регистрации в ruby ​​на рельсах. Я хочу подтвердить эту регистрационную форму. Например - если пользователь оставил какой-либо раздел пустым, в форме отобразится сообщение об ошибке. Он также проверит, является ли данное письмо уникальным. Как я могу сделать это, не меняя форму?

#This my logins_controller.rb file
class LoginsController < ApplicationController
skip_before_action :verify_authenticity_token
def index
    @subscriber=Subscriber.new()
end

def sign_up    
    subscriberNew = Subscriber.new
    subscriberNew.name = params[:name]
    subscriberNew.cus_user_name = params[:user_name]
    subscriberNew.cus_password = params[:password]
    subscriberNew.cus_email = params[:email]
    result = subscriberNew.save
    respond_to do |format|
        msg = { :status => "ok", :message => "Success!" }
        format.json  { render :json => msg }
    end
end





def validate_signup
    #what should i write here?
end

end

и это моя регистрационная форма

<div class="container">
<div class="shadow-lg p-3 mb-5 bg-white rounded view-card">
    <h4 class="card-title">
    <a href="/product_types">
    <i class="material-icons">
      arrow_back_ios
    </i></a></h4>
    <form id="signup_form" method="post" action="/sign-up">
            <p class="h4 mb-4">Register to Binimoy</p>
            <label for="name">Name</label>
            <input type="text" name="name" id="name" class="form-control mb-4" placeholder="Name">

            <label for="email">Email</label>
            <input type="email" name="email" id="email" class="form-control mb-4" placeholder="Email">

            <label for="phone">Phone</label>
            <input type="text" name="phone" id="phone" class="form-control mb-4" placeholder="Phone">

            <label for="name">Password</label>
            <input type="password" name="password" id="password" class="form-control mb-4" placeholder="Password">

            <div class="form-row mb-4">
                <div class="col">
                    <button class="btn btn-default my-4 btn-block" type="reset">Reset</button>
                </div>
                <div class="col">
                <button type="button" class="btn btn-info my-4 btn-block" id="submitAnchor">Submit</button>
                </div>
            </div>                
    </form>
</div>

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Rails - это фреймворк с твердым мнением, как делать вещи. Вы делаете вещи не так, как Rails, и это усложнит ситуацию.

Если вы действительно не хотите менять свою форму (что категорически против)

Добавьте проверки, проверьте возвращаемое значение save и отправьте обратно сообщение об ошибке

В вашей модели:

validates :email, presence: true, uniqueness: true

В вашем контроллере:

if subscriber.save render json: {status: "ok", message: "success"} else render json: {status: "nok", message: "something went wrong"} end

Вероятно, вам следует избавиться от свойства status и использовать для этого код состояния HTTP (отправив взамен ответы 201 (созданный) и 422 (необработанный объект))

Некоторые другие рекомендации, чтобы сделать ваш код более читабельным:

  • Следуйте соглашениям Rails (используйте построитель форм, это упрощает назначение параметров формы для модели
  • Использовать соглашения об именах Ruby:

    subscriberNew

должно быть

subscriber_new

, поскольку Ruby использует camel_case но на самом деле в суффиксе new нет необходимости, так что subscriber достаточно

  • Используйте два пробела для обозначения
  • Не сокращать переменные (cus_username, ...) и не использовать префикс, когда в этом нет необходимости
0 голосов
/ 05 ноября 2018

Во-первых, используйте помощники Rails в своих представлениях и напишите свою форму, как описано здесь .

<%= form_with url: sign_up_path do |form| %>
  <%= form.label :email %>
  <%= form.text_field :email %>
  ...
  <%= form.submit %>
<% end %>

Во-вторых, используйте проверки в вашей модели подписчика, как описано здесь .

validates :email, presence: true, uniqueness: true
...

Надеюсь, это поможет;)

...