2015-04-18 1 views
1

Мои формы управляются объектами и работают с 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> 
+0

': edit_type == 'password-change'' сравнивает строковый литерал для символа - это всегда будет false. e –

ответ

0

Рельсы способ сделать это следует использовать только одну форму:

<%= 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(leave blank if unchanged)' %> 
       </li> 
       <li> 
        <%= f.password_field :password_confirmation, :value => nil, :class => 'form-control', :placeholder => 'Neues Passwort wiederholen' %> 
       </li> 
<li> 
        <%= f.text_field :email, :value => @account.email, :class => 'form-control', :placeholder => 'Neue E-Mail Adresse' %> 
       </li> 

       <%= f.submit 'Absenden', :class => 'mysd-btn btn-primary' %> 
      </ul> 
     <% end %> 

Таким образом, любая конкретная причина, по которой вы используете две формы?

+0

Хорошо, но как я могу дифференцироваться в валидации? например как сказать, что password_confirmation необходимо ** в этой форме **, если пароль заполнен и в то же время электронная почта не нужна? – Freddy

+0

Если вы используете программу, она добавит проверки, которые потребуют правильного заполнения полей password & password_confirmation. Если вы делаете свой собственный аут, используя 'has_secure_password', он также сделает это. Далее '@ account.update (account_params)' будет массово обновлять заданные параметры, просто измените 'значение' с' nil' на их текущее значение ('@ account.email') – CuriousMind

+0

Спасибо за помощь. Мне пришлось очистить другие параметры, которые были пустыми. Одна форма работает просто отлично :) – Freddy

Смежные вопросы