Это намного проще, если вы просто следуете соглашениям с рельсами.
Начните с использования сильных параметров вместо того, чтобы весь этот человеческий компилятор ошибался, копируя переменные дважды из хеша 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 , который избегает потенциальных конфликтов имен.