Мои формы управляются объектами и работают с form_for. Я ищу для создания/редактирования страницы для 1 объекта с 2 формами. В частности, я хочу, чтобы пользователь мог изменить свой пароль, а также изменить его электронную почту на той же странице. В зависимости от того, какая форма была отправлена, проверки и т. Д. Должны принять правильные меры. Пока я не могу этого сделать.2 формы, одна страница, один объект в Rails
Я использую Rails 4.
Проблема: Моих проверки Procs, как представляется, не в состоянии обнаружить почты изменение/изменение пароля (см скрытого поля во взглядах), потому что я не могу использовать скрытое поле в Proc. Поэтому у меня нет способа определить, какую форму я представляю.
Пожалуйста, скажите мне, есть ли еще Rails, как сделать это чисто и аккуратно, или если это правильно, и я просто что-то совсем не вижу.
Вот файлы:
Контроллеры/accounts_controller.rb
def edit
set_pagedata('Account Informationen bearbeiten')
@account = @current_user
end
def update
@account = User.find(@current_user.id)
if @account.update(account_params)
redirect_to account_path
else
render 'edit'
end
end
private
def account_params
params.require(:user).permit(:email, :email_confirmation, :password, :password_confirmation)
end
модели/user.rb
class User < ActiveRecord::Base
has_one :admin
has_many :customerships
has_many :customers, :through => :customerships
validates :salutation, presence: { message: 'Die Anrede wird benötigt!', if: :new_record? }
validates :prename, presence: { message: 'Der Vorname wird benötigt!', if: :new_record? }
validates :surname, presence: { message: 'Der Nachname wird benötigt!', if: :new_record? }
validates :email,
presence: { message: 'Die E-Mail Adresse wird benötigt!', if: Proc.new { | c | c.new_record? || c.email.present? } },
uniqueness: { message: 'Diese E-Mail existiert bereits in unserem System!', if: Proc.new { | c | c.new_record? || c.email.present? } }
validates :password,
confirmation: { message: 'Das Passwort wiederholen Feld muss dem Passwort Feld entsprechen!', if: [:new_record?, :password_change?, '!password.nil?'] },
length: { minimum: 5, maximum: 16, message: 'Das Passwort muss mindestens 5 und darf höchstens 16 Zeichen lang sein!', if: [:new_record?, :password_change?, '!password.nil?'] },
presence: { message: 'Das Passwort wird benötigt!', if: [:new_record?, :password_change?, '!password.nil?'] }
has_secure_password :validations => false
def admin?
Admin.find_by_user_id(self.id) != nil
end
def password_change?
:edit_type == 'password-change'
end
def mail_change?
:edit_type == 'mail-change'
end
end
просмотров/счета/edit.html.erb
<div class="flash-stack">
<%= "<p class='text-danger'>#{@account.errors.full_messages.first}</p>".html_safe if @account.errors.any? %>
</div>
<div class="mysd-panel">
<div class="panel-heading">
<h3 class="panel-title">E-Mail Adresse ändern</h3>
</div>
<div class="panel-body">
<%= form_for @account, url: account_path, html: { :class => 'mysd-form' } do |f| %>
<ul class="form-container">
<li>
<%= f.text_field :email, :value => nil, :class => 'form-control', :placeholder => 'Neue E-Mail Adresse' %>
</li>
<li>
<%= f.text_field :password_confirmation, :value => nil, :class => 'form-control', :placeholder => 'Neue E-Mail Adresse wiederholen' %>
</li>
<%= f.hidden_field :edit_type, :value => 'password-change' %>
<%= submit_tag 'Absenden', :class => 'mysd-btn btn-primary' %>
</ul>
<% end %>
</div>
</div>
<div class="mysd-panel">
<div class="panel-heading">
<h3 class="panel-title">Passwort ändern</h3>
</div>
<div class="panel-body">
<%= form_for @account, url: account_path, html: { :class => 'mysd-form' } do |f| %>
<ul class="form-container">
<li>
<%= f.password_field :password, :value => nil, :class => 'form-control', :placeholder => 'Neues Passwort' %>
</li>
<li>
<%= f.password_field :password_confirmation, :value => nil, :class => 'form-control', :placeholder => 'Neues Passwort wiederholen' %>
</li>
<%= f.hidden_field :edit_type, :value => 'mail-change' %>
<%= f.submit 'Absenden', :class => 'mysd-btn btn-primary' %>
</ul>
<% end %>
</div>
</div>
': edit_type == 'password-change'' сравнивает строковый литерал для символа - это всегда будет false. e –