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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Ruby on Rails 4

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

Q&A

0回答

1798閲覧

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

NaojirouHisada

総合スコア60

Ruby

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2016/09/10 17:35

編集2016/09/11 03:37

実践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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2016/09/11 03:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問