2016-09-04 2 views
0

user.rbИспользование перечисления с выберите в form_tag

enum gender_type: [:male, :female] 
scope :gender, -> (gender_type) { where gender_type: gender_type} 

UsersController

@users = User.gender(params[:gender_type]).paginate(page: params[:page]) if params[:gender_type].present? 

index.html.erb

<%= form_tag users_path, method: :get do %> 
    <%= select_tag ??????           %> 
    <%= submit_tag "Search", :name => "nil", :id => "submit-gender" %> 
<% end %> 

цель будет в конечном итоге с:

example.com/users?gender_type=0 или example.com/users?gender_type=1

ответ

1

Чтобы получить отображения из перечисления атрибутов вы можете use the pluralised version of the the enum attribute name:

User. gender_types 
=> { male: 0, female: 1 } 

Вы можете позвонить Hash.to_a, чтобы получить массив пар, которые вы можете передать в options_for_select. Но вы можете использовать .map для преобразования ключей.

class User 
    self.gender_options 
    # or use the I18n module to humanize the keys 
    self.gender_types.map { |k,v| [k.capitalize, v] } 
    end 
end 

<%= select_tag 'gender', options_for_select(User.gender_options) %> 
+0

спасибо. это должно быть 'self.gender_types.map' и': gender_type' –

1

Попробуйте такого рода

select_tag 'gender', "<option value=0>male</option><option value=1>female</option>".html_safe 

или то вроде этого

select_tag 'gender', options_for_select([["male",0],["female",1]]) 

и вы можете прочитать рельсы API, чтобы найти решение http://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag

+1

спасибо. да, мне было любопытно, но как это сделать, не вручную перечисляя их (если возможно) для будущей справки, так как в следующий раз может быть гораздо больше двух вариантов. я соглашусь с этим, хотя, если никто не согласится с этим ответом. –

1

(я предполагаю, что вы неправильно набранный в имени файла users.rb и это обычный user.rb модель)

User.gender_types возвращает хэш {"male" => 0, "female" => 1}. Звучит просто!

select_tag :gender_type, options_for_select(User.gender_types)

+0

Я получаю эту ошибку. 'ActionView :: Template :: Ошибка (неопределенные статусы методов для # <Класс: 0x007f4199c56660>):' Также должно быть ': gender_type' not: gender –

+0

О, хорошо, мой плохой, обновил ответ. Вам нужно вызвать множественную версию слова, которое вы передаете в 'enum'. Вы хотите запустить 'User.gender_types'. – shlajin

+0

это привело к тому, что '' "male" => 0, "female" => 1} 'передается в опции выбора. Макс решил это. :) –