まず、sinatraのapp側でdbからの情報を@sex
に入れておきます。端的に言うと@sex = 'female'
などと設定された状態にします。Slim、Haml、ERBはそれぞれ次のように書きます。
Slimの例
Slim
1- [['male', '男'], ['female', '女'], ['other', '他']].each do |sex_type, display|
2 input> id="user_gender_#{sex_type}" type="radio" name="sex" value=sex_type checked=(sex_type == @sex)
3 label> for="user_gender_#{sex_type}" = display
Hamlの例
Haml
1- @sex = 'female'
2- [['male', '男'], ['female', '女'], ['other', '他']].each do |sex_type, display|
3 %input{id: "user_gender_#{sex_type}", type: "radio", name: "sex", value: sex_type, checked: sex_type == @sex}
4 %label{for: "user_gender_#{sex_type}"}= display
ERBの例
ERB
1<% @sex = 'female' %>
2<% [['male', '男'], ['female', '女'], ['other', '他']].each do |sex_type, display| %>
3 <input id="user_gender_<%= sex_type %>" name="sex" type="radio" value="<%= sex_type %>"
4 <% if sex_type == @sex %>checked<% end %>>
5 <label for="user_gender_<%= sex_type %>"><%= display %></label>
6<% end %>
考え方はどれも同じで、sex_type
が@sex
と同じだったらcheckedをつけるとしています。このとき、二つのinputを書くのでは無く、配列eachで回すのがコツです。後で、第三の性、第四の性、第五の性が追加されても簡単に実装できるからです。上の例は配列をべた書きしてますが、どこかに定数などで持たせておけば、入力やDBの値をチェックするバリデーションや、言語の切り替えなどができるようになります。
【注意】 ERBでの例を使う場合、sex_type
やdisplay
には必ずハードコーディングされた値が入るようにし、入力された値が入らないようにしてください。サニタイズされないため、任意の値が入るとXSS等の脆弱性の原因になります。(SlimとHamlでは自動的にサニタイズされます)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/16 17:29