2015-09-25 21 views
1

我正在用Rails做一個待辦事項列表。因此我製作了一個用戶模型(電子郵件和密碼)。我希望用戶能夠編輯帳戶,所以我在用戶控制器上進行了編輯和更新操作,我也有一個用戶模型。一切都很好,但我的問題是,在設置視圖中,用於更新電子郵件的text_field已經預先填好了模型中的當前電子郵件地址。由於設計方面的原因,我想禁用預填充(佔位符的內容應該立即可讀)。我知道當我解決這個問題時,用戶模型會出現另一個問題。例如,如果用戶只想更改密碼,用戶將收到一條錯誤消息,如:「電子郵件不能爲空」和「電子郵件無效」...我可以修改密碼的最小長度驗證如果密碼爲空,因爲我知道「has_secure_password」在創建對象時強制執行存在驗證。所以我知道新用戶將無法使用空白密碼進行註冊。但是,我怎樣才能爲電子郵件驗證創建相同的效果?我還沒有找到解決方案,如果有人能幫助我,我將不勝感激。提前致謝!如何禁用Rails中的預填表單字段?

問題:

  1. 如何禁用Rails的預充的形式?
  2. 應該修改什麼來接受設置表格 中的空白電子郵件,而不將電子郵件更新爲數據庫中的空白?

users_controller.rb(控制器)

def edit 
@user = User.find(params[:id]) 
end 

def update 
@user = User.find(params[:id]) 
if @user.update_attributes(user_params) 
    flash[:success] = "Profile updated!" 
    redirect_to @user 
else 
    render 'edit' 
end 
end 

edit.html.erb(視圖)

<% provide(:title, "Settings") %> 
<h4>SETTINGS</h4> 

<h5>User Edit</h5> 
<%= @user.email %> 
<div class="settings"> 
<%= form_for(@user) do |f| %> 
    <%= render 'layouts/error_messages' %> 

    <p>Change Email:</p> 
    <%= f.text_field :email, placeholder: "New Email", class: "formfield" %> 

    <p>Change Password:</p> 
    <%= f.password_field :password, placeholder: "New Password", class: "formfield" %> 
    <%= f.password_field :password_confirmation, placeholder: "New Password Confirmation", class: "formfield" %> 


    <%= f.submit "Save Changes", class: "form_button" %> 
<% end %> 

<%= link_to "Delete my Account", '#' %> 
</div> 

user.rb(模型)

class User < ActiveRecord::Base 
before_save { self.email = email.downcase } 
VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, 
       uniqueness: { case_sensitive: false } 
has_secure_password 
validates :password, length: { minimum: 6 }, allow_blank: true 

# Returns the hash digest of the given string. 
def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
               BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
end 
end 
+0

當你使用form_for的時候,它會綁定並在視圖中顯示模型值.. – Milind

回答

1

如何禁用Rails中的預填表單?

field添加value: nil要禁用預填充會做。

例如,

<%= f.text_field :email, value: nil, placeholder: "New Email", class: "formfield" %> 

什麼應該被修改爲接受的設置形式 空白電子郵件,而不在數據庫中更新電子郵件空白?

電子郵件驗證擦除presence: true

validates :email, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
+0

允許空白將允許nil被保存到數據庫的電子郵件不是嗎? –

+0

@japed比特混淆,同時''allow_blank'被'presence'驗證器忽略。更新。 – Pavan

+0

但我認爲他希望如此,如果他們有一封電子郵件,它不顯示在窗體中,但如果他們不輸入任何內容,那麼它將保持不變。允許空白將它設置在數據庫中爲零不會嗎?我可能錯了...... –

0

UPDATE 你必須與value=nil添加屬性在您編輯表單的第一次,讓您的佔位符顯示出來。

<%= f.text_field :email, value: nil, placeholder: "New Email", class: "formfield" %> 

然後,爲了避免驗證您的模型,您可以在驗證之前在您的控制器中添加值電子郵件。例如:

def update 
    @user = User.find(params[:id]) 
    user_params[:email] = @user.email if params[:user][:email].nil? 
    if @user.update_attributes(user_params) 
    flash[:success] = "Profile updated!" 
    redirect_to @user 
    else 
    render 'edit' 
    end 
end 

我希望它可以幫助你

+0

感謝您的嘗試,但這並沒有在Rails中工作... – trickydiddy

+0

我明白了。我會更新我的答案。 – akbarbin

+0

對不起,我答覆遲到,但我一直在度假......感謝您的幫助,但它沒有工作既不驗證doenst允許:/ – trickydiddy

0

只要使用的form_tag,而不是的form_for

像這樣<%=的form_tag '/ SOME_URL' 辦%> http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

要允許空白電子郵件在您的驗證中添加allow_blank:true

validates :email, length: { maximum: 255 }, 
      format: { with: VALID_EMAIL_REGEX }, 
      uniqueness: { case_sensitive: false }, 
      allow_blank: true 

http://edgeguides.rubyonrails.org/active_record_validations.html#allow-blank 驗證存在和allow_blank都沒有意義。

+0

您的解決方案將電子郵件更新爲數據庫中的空白,用戶可以使用空白電子郵件註冊...這不是目標,而是感謝您的嘗試。 註冊應使用電子郵件驗證,並且用戶不應該能夠註冊空白電子郵件。如果電子郵件表單爲空,則在用戶設置中將Exceptation設置爲空,那麼電子郵件應保持不變,否則如果在電子郵件表單中輸入了某些內容,驗證應該再次運行。 感謝Pavan我知道如何禁用預填充。只需在表單中給出值爲零的值即可禁用預填。 – trickydiddy

0

1 - 也許不是你正在尋找的解決方案,但你可以用javascript清除字段。

2 - 可以使用條件的驗證,從rails docs

class Order < ActiveRecord::Base 
    validates :email, presence: true, unless: :email_present? 

    def email_present? 
    self.email.blank? 
    end 
end 

代碼沒有測試,但必須靠近一個有效的解決方案。

+0

不是真的,因爲它也將允許註冊視圖上的空白註冊! :(我想要一個沒有預先填寫的表單,如果用戶不輸入任何內容,那麼它將仍然保持在數據庫中沒有更新到空白...這應該是一個期望,只有在用戶設置可能... ... 我想我也許可以做一個before_validation調用更新只是爲了重置電子郵件的存儲值之前驗證啓動但我不知道如何才能完成這隻在用戶設置視圖...:/ 感謝您的嘗試! – trickydiddy

相關問題