質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

incompatible character encodings: ASCII-8BIT and UTF-8を修正したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,346

score 60

実践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
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • maisumakun

    2016/09/11 12:28

    表題のエラーはどこの行で出ていますか?

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る