simple_form默认集合,如果为空

时间:2016-04-05 20:25:38

标签: ruby-on-rails simple-form

在我的简单表单中,我想引用一个集合,并具有以下行为:

  • 如果该字段为空,请使用集合中指定的默认值
  • 允许用户下拉一组有效值
  • 如果记录已保留,则将保存的值显示为默认值

到目前为止,我的代码是这个(也使用simple_enum)

<script src="https://code.angularjs.org/1.3.14/angular.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script>
<script src="https://rawgit.com/angular-ui/angular-google-maps/2.0.X/dist/angular-google-maps.js"></script>
<div ng-app="appMaps" ng-controller="mainCtrl"> 
        <ui-gmap-google-map 
          center='map.center' 
          zoom='map.zoom'  
          aria-label="Google map">
        <ui-gmap-marker ng-repeat="marker in markers"
                        coords="marker.coords" 
                        options="marker.options" 
                        events="map.events" idkey="marker.id">
        </ui-gmap-marker>
        <ui-gmap-window show="map.window.show" coords="map.window.coords" >
            <div>
               <img class="img-responsive img-circle" ng-src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Mercedes-Benz_Zetros_2008.jpg/1280px-Mercedes-Benz_Zetros_2008.jpg"  />
                  Shop Name : {{map.window.title}} - 
                  Employees # : <a ui-sref="employees({ sectorid: {{ map.window.Pksectorid }} })">{{ map.window.Employeecount }}</a>
            </div>
          </ui-gmap-window>
      </ui-gmap-google-map>
</div>

如何设置不会覆盖保存值的默认值?

2 个答案:

答案 0 :(得分:2)

如果current_user.fluent_language尚未保存,您可以尝试设置<% current_user.fluent_language ||= "you_default_value" %> <%= f.input :back_language, collection: enum_option_pairs(Flashcard, :back_language), label: false, selected: current_user.fluent_language %> 的值:

fluent_language

编辑: 我不确定你的back_language<% current_user.back_language ||= "you_default_value" %> <%= f.input :back_language, collection: enum_option_pairs(Flashcard, :back_language), label: false %> 的实现是什么样的,但根据评论,可能更好的解决方案就是这样:

{listDepth > 0}?

答案 1 :(得分:2)

编辑:

结果改革有一个简单的方法来实现这一点。 :)

在表单对象中调用property时,只需传入default选项。

property :back_language, default: model.fluent_language

瞧!

原始答案:

simple_formreform一起使用时,表单对象会在您调用property时定义getter和setter。这些方法被委托给model,但如果您需要以不同方式填充表单或在保存之前操作表单数据,则可以覆盖它们。

在您的情况下,您可能希望覆盖back_language

的getter方法

在您的模板中,您将拥有:

<%= f.input :back_language, 
            collection: enum_option_pairs(Flashcard, :back_language), 
            label: false %>

表单对象将具有:

model :user
property :back_language

def back_language
  # takes care of both new and edit actions
  super || model.fluent_language
end

<强>替代地

如果您不想处理表单对象,可以执行以下操作:

<%= f.input :back_language, 
            collection: enum_option_pairs(Flashcard, :back_language), 
            label: false, 
            selected: (@form.back_language || current_user.fluent_language) %>

但我不建议在模板中保留逻辑。