Как правильно опубликовать HTML-форму на контроллере в Ruby на рельсах 5.2.3 - PullRequest
0 голосов
/ 13 апреля 2019

Я новичок в рубине на рельсах.Здесь я пытаюсь разместить html-форму на ruby ​​на рельсах (версии 5.2.3) . Для этого я рекомендую найти решение, найденное здесь ссылка

<form accept-charset="UTF-8" method='post' action='http://localhost:3000/user1s'>


        <label for='name'>Name</label>
            <input type="text" name='name' placeholder='Enter your name'> <br>
        <label for='password'>password</label>
            <input type="text" name='password' placeholder='Enter your password'> <br>
        <label for='email'>confirm pass</label>
            <input type="text" name='password_confirmation' placeholder='Enter your password_confirmation'> <br>

            <input type="submit" value='Save'>
    </form>

user1 controller

class User1sController < ApplicationController


  # POST /user1s
  # POST /user1s.json
  def create
    @name = params[:name]
    @password = params[:password]
    @password_confirmation = params[:password_confirmation]
    @user1 = User1.new(name=>@name, password=>@password , password_confirmation=>@password_confirmation)

    respond_to do |format|
      if @user1.save
        format.html { redirect_to @user1, notice: 'User1 was successfully created.' }
        format.json { render :show, status: :created, location: @user1 }
        #format.json {status: :created }
      else
        format.html { render :new }
        format.json { render json: @user1.errors, status: :unprocessable_entity }
      end
    end
  end


end

Вот config / rout.rb

Rails.application.routes.draw do
  #resources :user1s
  post '/user1s', to: 'user1s#create', as: 'user1s'  
end

При запуске кода появляется следующая ошибка

Браузер возвратил нулевое происхождение для запроса с включенной защитой от подделки происхождения.Обычно это означает, что у вас включен заголовок «Referrer-Policy» «no-referrer», или что запрос поступил с сайта, который отказался сообщить свое происхождение.Это делает невозможным для Rails проверку источника запросов.Вероятно, лучшее решение - изменить политику реферера на что-то менее строгое, например, того же происхождения или строго-того же происхождения.Если вы не можете изменить политику реферера, вы можете отключить проверку происхождения с помощью параметра Rails.application.config.action_controller.forgery_protection_origin_check.

Чтобы смягчить ошибку, приведенную выше, я ссылаюсь на ссылку, которая пока предлагает решения нижене могу заставить его работать. ссылка 2

в config / application.rb У меня есть

Bundler.require(*Rails.groups)

module Saverecord
  class Application < Rails::Application
    Rails.application.config.action_controller.forgery_protection_origin_check = false
    config.action_controller.allow_forgery_protection = false

    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

  end
end

на контроллере приложения у меня

class ApplicationController < ActionController::Base   
  # Prevent CSRF attacks by raising an exception.   
  # For APIs, you may want to use :null_session instead.   
  #protect_from_forgery with: :exception   
  protect_from_forgery with: :null_session


end  

1 Ответ

1 голос
/ 14 апреля 2019

Это намного проще, если вы просто следуете соглашениям с рельсами.

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

class User1sController < ApplicationController
  # POST /user1s
  # POST /user1s.json
  def create
    # Use strong parameters instead  
    @user1 = User1.new(user1_parameters)

    respond_to do |format|
      if @user1.save
        format.html { redirect_to @user1, notice: 'User1 was successfully created.' }
        format.json { render :show, status: :created, location: @user1 }
        #format.json {status: :created }
      else
        format.html { render :new }
        format.json { render json: @user1.errors, status: :unprocessable_entity }
      end
    end
  end

  # ...
  private 
  def user1_parameters
    params.require(:user1).permit(:name, :email, :password, :password_confirmation)
  end
end

В Ruby (и Rails) есть фантастические возможности для манипулирования хешами.Если вы когда-либо копируете ключи вручную из одного хэша в другой, вы делаете это неправильно.

Затем используйте помощник по формам вместо того, чтобы вручную создавать форму:

<%= form_with(model: @user1) do |form| %>
  <div class="field">
    <%= form.label :name %>
    <%= form.text_field :name %>
  </div>
  <div class="field">
    <%= form.label :email %>
    <%= form.email_field :email %>
  </div>
  <div class="field">
    <%= form.label :password %>
    <%= form.password_field :password %>
  </div>
  <div class="field">
    <%= form.label :password_confirmation %>
    <%= form.password_field :password_confirmation %>
  </div>
  <div class="actions">
    <% form.submit %>
  </div>
<% end %>

В Rails встроены Контрмеры противодействия подделке сайтов (CSRF) , что означает, что Rails будет отклонять отправку форм, которые не содержат действительный токен CSRF.Когда вы создаете форму с form_with (или более старыми form_tag и form_for), Rails включает токен CSRF в качестве скрытого ввода в форме.

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

Ваша форма также не использует правильный name атрибута для вложенного хэша.Rails по соглашению использует вложенные хэши:

{
  users1: {
    name: 'foo',
    email: 'foo@example.com'
    ...
  }
}

Помощник формы делает это, устанавливая правильный атрибут имени на входах:

<input type="email" name='user1[email]' ...>

, который работает с params.require(:user1).permit(...).Ваша форма выдаст ошибку ActionController::ParameterMissing.Вы можете обойти это, используя плоские хэши, но вы также можете изучить Rails Way , который избегает потенциальных конфликтов имен.

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