実践Ruby on Rails4という本でRailsについて勉強しています。
現在プレゼンターというものを使用してフォーム簡潔に書く章をしているのですが、フォームプレゼンターを使用した際に2つのエンコードが混在してしまいます。
エラーの原因を探ったのですが、
まず、
<%= form_for @change_password_form, url: :staff_password ,method: :patch do |f| %> <%= markup do |m| p = FormPresenter.new(f ,self) debug p
とした時点でエラーが発生しました。
自分の考えだと、
class FormPresenter include HtmlBuilder attr_reader :form_builder, :view_context delegate :label , :text_field , :password_field , :check_box , :radio_button , :text_area , :object , to: :form_builder def initialize(form_builder,view_context) @form_builder = form_builder @view_context = view_context end
上記部分で、
エンコードが変更されているのだと思いますが、
原因を修正するまでには至りませんでした。
ちなみに、
仮に通常通りにフォームを記述すると正常に動作されます。
どなたかアドバイスをください。
よろしくお願いします。
下記に使用されているソースコードを載せておきます。
ソースコード
<%= form_for @change_password_form, url: :staff_password ,method: :patch do |f| %> <%= markup do |m| p = FormPresenter.new(f ,self) debug p # p.with_options(required: true,size:32) do |q| # # m << q.password_field_block(:current_password, '現在のパスワード') # m << q.password_field_block(:new_password , '新しいパスワード') # m << q.password_field_block(:new_password_confirmation, '新しいパスワード(確認)') # end end %> <div class="buttons"> <%= f.submit '変更' %> <%= link_to 'キャンセル' , :staff_account %> </div> <% end %>
class FormPresenter include HtmlBuilder attr_reader :form_builder, :view_context delegate :label , :text_field , :password_field , :check_box , :radio_button , :text_area , :object , to: :form_builder def initialize(form_builder,view_context) @form_builder = form_builder @view_context = view_context end def notes markup(:div,class: 'notes') do |m| m.span '*' , class: 'mark' m.text '印の付いた項目は入力必須です。' end end def text_field_block(name,label_text,options = {}) markup(:div,class: 'input-block') do |m| m << decorated_label(name,label_text,options) m << text_field(name,options) m << error_messages_for(name) end end def password_field_block(name,label_text,options = {}) markup(:div,class: 'input-block') do |m| m << decorated_label(name,label_text,options) m << password_field(name,options) m << error_messages_for(name) end end def date_field_block(name,label_text,options = {}) markup(:div,class: 'input-block') do |m| m << decorated_label(name,label_text,options) m << text_field(name,options) m << error_messages_for(name) end end def error_messages_for(name) markup do |m| object.errors.full_messages_for(name).each do |message| m.div(class: 'error-message') do m.text message end end end end private def decorated_label(name,label_text,options = {}) label(name,label_text,class: options[:required] ? 'required' : nil) end end
class StaffMemberFormPresenter < FormPresenter def password_field_block(name,label_text,options = {}) if object.new_record? super(name,label_text,options) end end def full_name_block(name1,name2,label_text,options = {}) markup(:div , class: 'input-block') do |m| m << decorated_label(name1,label_text,options) m << text_field(name1,options) m << text_field(name2,options) m << error_messages_for(name1) m << error_messages_for(name2) end end def check_boxes markup(:div , class: 'input-block') do |m| m << check_box(:suspended) m << label(:suspended , 'アカウント停止') end end end
module HtmlBuilder def markup(tag_name = nil , options = {}) root = Nokogiri::HTML::DocumentFragment.parse('') Nokogiri::HTML::Builder.with(root) do |doc| if tag_name doc.method_missing(tag_name, options) do yield(doc) end else yield(doc) end end root.to_html.html_safe end end
class Staff::PasswordsController < Staff::Base def show redirect_to :edit_staff_password end def edit @change_password_form = Staff::ChangePasswordForm.new(object: current_staff_member) end def update @change_password_form = Staff::ChangePasswordForm.new(staff_member_params) @change_password_form.object = current_staff_member if @change_password_form.save flash.notice = 'パスワードを変更しました。' redirect_to :staff_account else flash.now.alert = '入力に誤りがあります。' render action: 'edit' end end private def staff_member_params params.require(:staff_change_password_form).permit( :current_password , :new_password , :new_password_confirmation ) end end
表題のエラーはどこの行で出ていますか?
あなたの回答
tips
プレビュー