Rails:如何使用简单形式的groups_select设置值

时间:2016-04-18 10:02:29

标签: ruby-on-rails ruby-on-rails-4

我引用the top voted answer of this post来创建分组选择框。

我想要做的是将值设置为整数而不是列出的名称。

例如,我想设置如下;

<optgroup label="Transportation">
  <option value="1">bus</option>
  <option value="2">taxi</option>
  <option value="3">train</option>
</optgroup>
<optgroup label="Eat/Drink">
  <option value="11">meal</option>
  <option value="12">tea</option>
</optgroup>

而不是

<optgroup label="Transportation">
  <option value="bus">bus</option>
  <option value="taxi">taxi</option>
  <option value="train">train</option>
</optgroup>
<optgroup label="Eat/Drink">
  <option value="meal">meal</option>
  <option value="tea">tea</option>
</optgroup>

我的观点如下。

    <%= f.simple_fields_for :days, @days do |d| %>

        <%= d.simple_fields_for :events do |e| %>

          <span class="form-inline">
            <p>
              <%= e.input :category, 
                :as => :grouped_select, 
                collection: [["Transportation", ["bus", "taxi", "train" ]],["Eat/Drink", ["meal", "tea/cafe"]]], 
                :group_method => :last, 
                label: false 
              %>
            </p>
          </span>
          <%= e.input :title, label: false %>

        <% end %>
      </div>

    <% end %>

如果你能告诉我如何自己设定价值,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以将带有单独值的文本作为双元素数组传递给grouped_select输入,而不仅仅是值:

<%= e.input :category, 
            :as => :grouped_select, 
            collection: [["Transportation", [["bus", 1], ["taxi", 2], ["train", 3]]],
                         ["Eat/Drink", [["meal", 11], ["tea/cafe", 12]]]], 
            :group_method => :last, 
            label: false 
          %>

第一个元素是select中的文本,第二个元素是提交时将在params中传递的值。

上面的代码生成以下html:

<select class="grouped_select optional" name="...">
  <option value=""></option>
  <optgroup label="Transportation">
    <option value="1">bus</option>
    <option value="2">taxi</option>
    <option value="3">train</option>
  </optgroup>
  <optgroup label="Eat/Drink">
    <option value="10">meal</option>
    <option value="11">tea/cafe</option>
  </optgroup>
</select>

您实际上可以使用options_for_select助手支持的任何样式(例如,使用哈希而不是2元素数组),请参阅documentation

答案 1 :(得分:0)

这个问题已经很久了,但它是&#34; simple_form分组选择&#34;的最佳结果。谷歌搜索无论如何,所以我认为下一个读者可能会受益于一些创造性的方法来创建这些最新的simple_form(从测试中获取,确实是最好的文档)

void delete_tree(struct tree **ptr,int item) 
{ 
      struct tree *move,*back,*temp; 

      if(*ptr==NULL) 
      { 
               printf("nEmpty tree..............n"); 
               return; 
      } 
      else 
      { 
               move=*ptr; 
               back=move;

               while(move->info!=item) 
               { 
                         back=move;

                         if(item<move->info) 
                         {
                                   move=move->left; 
                         } 
                         else 
                         { 
                                  move=move->right; 
                         } 
               }

               if(move->left!=NULL&&move->right!=NULL) 
               {

                         temp=move->right;

                         while(temp->left!=NULL) 
                         { 
                                  back=temp; 
                                  temp=temp->left; 
                         }

                         move->info=temp->info; 
                         move=temp; 
               }

               if(move->left==NULL&&move->right==NULL) 
               { 
                         if(back->right==move) 
                         { 
                                  back->right=NULL; 
                         } 
                         else 
                         { 
                                  back->left=NULL; 
                         }

                         free(move); 
                         return; 
               }

               if(move->left==NULL && move->right!=NULL) 
               { 
                         if(back->left==move) 
                         { 
                                  back->left=move->right; 
                         } 
                         else 
                         { 
                                  back->right=move->right; 
                         }

                         free(move); 
                         return; 
               }

               if(move->left!=NULL && move->right==NULL) 
               {
                          if(back->left==move) 
                         { 
                                  back->left=move->left; 
                         } 
                         else 
                         { 
                                  back->right=move->left; 
                         }

                         free(move); 
                         return;