質問編集履歴

1 エラー発生箇所を具体的にしました。

NaojirouHisada

NaojirouHisada score 60

2016/09/11 12:37  投稿

incompatible character encodings: ASCII-8BIT and UTF-8を修正したい
実践Ruby on Rails4という本でRailsについて勉強しています。
現在プレゼンターというものを使用してフォーム簡潔に書く章をしているのですが、フォームプレゼンターをインスタンス化した際に2つのエンコードが混在してしまいます。
現在プレゼンターというものを使用してフォーム簡潔に書く章をしているのですが、フォームプレゼンターを使用した際に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
```
上記部分で、
エンコードが変更されているのだと思いますが、
原因を修正するまでには至りませんでした。
ちなみに、
仮に通常通りにフォームを記述すると正常に動作されます。
おそらく、  
initializeの時点で文字コードが混在していると思われるのですが、  
解決策が見つけることができません。  
どなたかアドバイスをください。
よろしくお願いします。
下記に使用されているソースコードを載せておきます。
ソースコード
```
 <%= 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
```
  • Ruby

    17376 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 4

    2666 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る