2011-10-04 95 views
31

當我將'Required'屬性
添加到html輸入字段時,Rails會在標籤前預先加上一個星號(*)。如何禁用窗體的必填字段中的星號?

有誰知道如何防止這種情況?

出於某種原因Rails的轉換這樣的:

<%= f.input :Company, :input_html => {:value => "", :id => "company_name"}, :label => "company name" %> 

到這一點:

<div class="input string required"> 
    <label for="company_name" class="string required"> 
    <abbr title="required">*</abbr> company name</label> 
    <input type="text" value="" size="50" required="required" name="lead[Company]" id="company_name" class="string required"> 
</div> 

我不喜歡它在一個DIV包裝的一切,並增加了一個abbr元素來參加聚會。

我該如何預防?

+4

你可以發表你正在談論的代碼嗎?這將有所幫助。 –

+0

@Lester Peabody - 我用我的代碼示例更新了這個問題 – vsync

+2

您是否在使用'formtastic'或'simple_form'這樣的寶石?請發佈你的'Gemfile'。 – htanata

回答

27

在配置/初始化/ simple_form.rb加入這一行:

config.label_text = lambda { |label, required| "#{label}" } 
+1

我不得不從註冊表字段中取消註釋行,並更改我的語言環境目錄中的yaml文件中的html:''。 FWIW,我正在使用simple_form和devise和bootstrap。不知道或認爲這是有所作爲 – shicholas

+0

我試過了語言環境解決方案,但沒有工作,但是這樣做了。我使用的是simple_form 2.0.4 –

+6

使用3.0-RC2,我使用了這個:config.label_text = lambda {| label,required,explicit_label | 「#{label}」} – JosephK

18

我使用Rails 3.1,我在我的_form.html.erb對於給定的模型下面的視圖代碼:

<div> 
    <%= f.label :full_name %><br/> 
    <%= f.text_field :full_name, :required => true %><br/> 
</div> 

標籤不顯示星號,如果你做這種方式。除非您發佈代碼,否則我無法確定您的方法是什麼,以及我的解決方案是否適合所述方法。

更新回答: 這聽起來像你從某人繼承了這段代碼。無論如何,在閱讀你的代碼示例之後,你絕對使用simple_form gem。關於那個寶石的信息可以在這裏找到https://github.com/plataformatec/simple_form。要回答你的問題,如果你改變你的代碼如下:

<%= f.input :Company, :input_html => {:value => "", :id => "company_name"}, :label => "company name", :required => false %> 

這應該關掉星號。

根據你對simple_form生成的HTML的厭惡情況,我覺得你應該放棄使用gem,並使用Rails的默認表單助手重新編寫表單代碼,這可以在這裏閱讀http://guides.rubyonrails.org/form_helpers.html。根據代碼庫的大小,你可能更願意吸取它並學習如何使用simple_form gem以節省時間,但如果你認爲有時間去改變它,那就去做吧。

+0

謝謝,我會嘗試分解它。目前我使用它作爲一條線的組合,也許是原因。 – vsync

+0

沒問題,如果這有效,請確保將其標記爲已接受的答案,以便其他人可以受益。 –

+0

我不明白,由於某些原因,RoR認爲所有字段默認都是需要的 – vsync

5

它根本不是導軌。這是simple_form寶石。所以,如果你不希望所有的包裝元素都不使用simple_form。使用Rails表格helpers。這會比定製你不喜歡的東西更簡單。

45

只需將所需的標記空值simple_form的語言環境文件:

en: 
    simple_form: 
    required: 
     text: 'required' 
     mark: '*' 

或者使用CSS來隱藏它。

+0

會創建空html元素?因爲這將是一個非常不希望的結果。 – vsync

+10

這不再有效 - 你現在需要取消註釋下面的「html」行(或者添加它,如果你還沒有的話),然後將其設置爲'html:''' – DaveStephens

+2

這就是答案!如果有其他人想知道,你應該在config/locales/ – jlstr

0

我發現,如果你只是想刪除它後面的星號(*),那麼所有你需要做的就是去這個文件file /config/locales/simple_form.en.yml

再次不更改配置文件是個好做法對於寶石以及出於某種原因而使用的東西,它始終存在一個問題,爲什麼您真的使用simple_form!

但比如我發現了,由於有關於我們使用simple_form偉大的事情,但現在是一個更好的可用性的做法對沒有必填字段,然後需要的人的星號。

3

對於使用Formtastic和有這個問題的人,您可以通過編輯配置文件,通常是應用程序/ config中刪除星號/initializers/formtastic.rb

改變這一行:# Formtastic::SemanticFormBuilder.required_string = "(required)"

是:Formtastic::SemanticFormBuilder.required_string = ""

更多信息here

0

你可以使用form_for,並在config/initializer重寫方法def label爲必填字段添加星號,如下所示:

def label(object_name, method, content_or_options = nil, options = nil, &block) 
    if content_or_options.is_a?(Hash) 

     content_or_options.each do |key, val| 
     options[key] = val 
     end 

     content_or_options = method.to_s 
    end 

    content_or_options ||= method.to_s 

    presence_validations = [ActiveModel::Validations::PresenceValidator, ActiveRecord::Validations::PresenceValidator] 

    class_obj = options[:object].class if options[:object] 
    class_obj ||= object_name.to_s.camelize.constantize 

    validations = class_obj.validators_on(method.to_s).map(&:class) 

    if (presence_validations.map { |pv| validations.include?(pv) }).any? 
     content_or_options += "*" 
    end 

    Tags::Label.new(object_name, method, self, content_or_options, options).render(&block) 
end 

這種方法所有必填字段後把星號,如果使用正常form_for,並用validates_presence_of

11

最簡單的方法就是用這個CSS來隱藏:

abbr[title="required"] { 
    display: none; 
} 
+1

這個爲我工作得很好。 – Andreas

+0

@Andreas尼斯和簡單贏得比賽。很高興幫助。 – VoA

3

代碼已經幫我解決了星號問題:

abbr[title="required"] { 
    display: none; 
} 

所選擇的答案與其他建議,要求更改區域設置文件中的力HTML幫助我的最新Simple_form寶石。

+1

在simple_form引導配置中,在哪裏添加此代碼? Thx – user553620

1

除了在接受的答案中建議的全局配置,您可以通過required: false作爲輸入選項,或defaults: { required: false }爲整個表單設置它。

+0

其他人已經在6年前的[答案](https://stackoverflow.com/a/7651132/104380)中說過這一點..你不會對這個老問題提供任何新見解.. – vsync

+0

是的,我做了:將其設置爲整個表單。我的回答也非常簡短,這很好。 – inopinatus

+0

確實如此,你提到'defaults'的部分確實是新鮮的信息 – vsync

相關問題