Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

undefined method `safe_concat' for nil:NilClass when used with HAML #11

Closed
kichiro opened this issue Feb 19, 2011 · 5 comments
Closed

Comments

@kichiro
Copy link

kichiro commented Feb 19, 2011

ページ全体をhamlで書いている場合に、= paginate @entries でpaginationを出力しようとした場合に、「undefined method `safe_concat' for nil:NilClass」というエラーになりました。
(0.9.9までは大丈夫だった書き方)

rails generate kaminari:views default -e haml を実行しapp/views/kaminari以下にファイルを作ると、hamlの場合でもpaginationが出力できるようになり、特に問題はありません。

0.9.12で「Moved the whole pagination logic to the paginator partial」とあるので、そのためかもしれません。

ドキュメントのどこかに「hamlを使う場合は最初に rails generate kaminari:views default -e haml を実行しましょう」のようなことが書かれているほうが分かりやすいかもしれません。

以下、試した際にviewに出たエラーです。
バニラな環境で再現できます。

undefined method `safe_concat' for nil:NilClass

Extracted source (around line #9):

6: remote: data-remote
7: paginator: the paginator that renders the pagination tags inside
8: -%>
9: <%= paginator.render do -%>
10:


11: <%= current_page > 1 ? prev_link_tag : prev_span_tag %>
12: <% each_page do |page| -%>

@amatsuda
Copy link
Member

ご報告ありがとうございます。
が、どうもこちらでは再現できていない感じです。
ひとつ確認なんですが、そのエラーが起きている状態でお手元のアプリ内の app/views/kaminari の中身をいったん消してみてもダメということでしょうか?

@kichiro
Copy link
Author

kichiro commented Feb 20, 2011

rails newからEntryのモデルをcrudするだけのアプリを作りなおしてみました。
gemはkaminariとhaml、sqlite3の3つのみ。

  1. rails g scaffold entry title:string content:text
  2. app/views/layouts/application.html.erbを app/views/layouts/application.html.hamlとしてつくりなおす。同様にscaffoldが作成したindex.html.erb等を全てhamlになおす。
    3.この状態で、entryの作成と表示は可能。kaminariを使用しない一覧表示も可能。
  3. kaminariを使うようにする。indexアクションで@entries = Entry.order("entries.created_at DESC").page(params[:page])、viewで = paginate @entries
  4. viewに次のようなエラーが出力される。

NoMethodError in Entries#index

Showing /Users/foo/.rvm/gems/ruby-1.9.2-p136/gems/kaminari-0.9.13/app/views/kaminari/_paginator.html.erb where line #9 raised:

undefined method `safe_concat' for nil:NilClass

Extracted source (around line #9):

6: remote: data-remote
7: paginator: the paginator that renders the pagination tags inside
8: -%>
9: <%= paginator.render do -%>
10:


11: <%= current_page > 1 ? prev_link_tag : prev_span_tag %>
12: <% each_page do |page| -%>

エラーの最初のところに
「Showing /Users/foo/.rvm/gems/ruby-1.9.2-p136/gems/kaminari-0.9.13/app/views/kaminari/_paginator.html.erb where line #9 raised:」
と出ているので、この状態でのアプリを見てみたところ、
app/views/kaminariディレクトリは存在しません。

なので、松田さんがお書き下さった
「お手元のアプリ内の app/views/kaminari の中身をいったん消してみてもダメということでしょうか?」は出来ません。

おそらく、いきなりhamlを使ってアプリをつくると、使うべきhamlのpagination用のテンプレートは無いのでエンジンのものを見に行こうとするものの、エンジン側は上のエラーにあるようなerbのテンプレートを出力しているのでうまくいかない、ということでしょうか? hamlの中でerbって出力できたような感じもしましたが…。

ともあれ、この手順でこのエラーが出力されていても、
この段階で
rails generate kaminari:views default -e haml
でapp/views/kaminari以下を作ると、期待通りにpagination部分が出力されるようになります。

次にapp/views/kaminariを削除すると、再び同じエラーが出るようになります。

kaminariのlib/kaminari/tags.rbの46行目あたり、「3. the default one inside the engine」のケースでtemplate_filenameメソッドを使う場合に、hamlの場合に見つからないもしくはerb版が見つかってしまう感じでしょうか?

rails 3.0.4, ruby 1.9.2-p136, kaminari 0.9.13, haml 3.0.25のセットです。

@amatsuda
Copy link
Member

ご丁寧な報告を本当にありがとうございます。おかげで無事(?)再現できました。
たぶんぬるぽが起きないように修正できたと思うので、次のバージョンでは直っているものと思われます。
(本当はバグが再現しないことをご確認いただいた上でチケットをクローズしたいのですが、GitHub Issuesの性質上、修正commitをpushするとこのチケットは自動クローズされてしまいます。お手数ですが、不具合が再発するようであれば、再度ご報告いただけるとありがたいです。)

@amatsuda
Copy link
Member

closed by 4809198 always create the paginator's own output_buffer rather than reusing the template's one

because the template's output_buffer is not yet instantiated in some cases

@kichiro
Copy link
Author

kichiro commented Feb 20, 2011

headを持ってきて確認しました。どうもありがとうございました。

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants