10

コントローラーで以下のコードを実行すると、以下のエラーが発生します。render_to_string に渡されますが:formats=>[:json]、エラーに注意してください。:formats=>[:html]

私は何を間違っていますか?何か案は?実際、以下のコードは以前は問題なく機能していましたが、どの変更がこのエラーに影響したかはわかりません。レールのバージョン: 3.2.8

ところで、テンプレートは間違いなく配置されています: loc/_search_details.html.erb

おまけの質問: render_to_string に渡すことができるパラメーターとその仕組みを示す API ドキュメントはどこにありますか?

エラー: ActionView::MissingTemplate ({:locale=>[:en]、:formats=>[:json]、:handlers=>[:erb、:builder、:coffee]} で部分的な loc/search_details がありません。

  respond_to do |format|
    format.json { 
      @detail_str = render_to_string(:partial => 'loc/search_details', :layout => false, :formats=>[:html], :locals => {:beer_results => @beer_results})
      @list_str = render_to_string(:partial => 'loc/search_list', :layout => false,:formats=>[:html], :locals => {:beer_results => @beer_results})
      render :json => {:results => @results_hash, :result_details => @detail_str, :result_list => @list_str }

      }
  end
4

5 に答える 5

4

この質問この問題を参照してください。JSON リクエストを作成しているためrender_to_string、パーシャルが_search_details.json.erb. 追加の JSON パーシャルを提供するか、パーシャルの名前を変更するか、これをパーシャルに追加するか、<% self.formats = [:json, :html] %>その質問に対する受け入れられた回答の回避策を試すことができます。

于 2012-12-05T00:11:48.953 に答える
4

試してみたらどうですか

render_to_string(:partial => 'loc/search_details.html.erb', :layout => false, :locals => {:beer_results => @beer_results})

または

with_format("html") { render_to_string(:partial => 'loc/search_details', :layout => false, :locals => {:beer_results => @beer_results}) }

そして、メソッドを追加します

private
def with_format(format, &block)
  old_format = @template_format
  @template_format = format
  result = block.call
  @template_format = old_format
  return result
end

ソース: Rails で異なる形式のパーシャルをレンダリングするにはどうすればよいですか?

于 2012-12-04T22:56:52.203 に答える
1

誰かが同じ問題を抱えている場合に備えて、これが私のために働いたものです.

使用時に表示されたエラーメッセージrender_to_stringは、質問とまったく同じで、format不一致がありました。しかし、それは実際には問題の原因ではありませんでした。

問題は、アプリが国際化されていて、URL にロケールが指定されていたことです。私routes.rbはこのように見えます:

Quoties::Application.routes.draw do

  scope "(:locale)", locale: /en|pl/ do
    # all routes go here
  end

end

そして私application_controller.rbはこのように見えました:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :set_locale

  def default_url_options(options={})
    locale = I18n.locale
    locale = nil if locale == :en
    { locale: locale  }
  end

  def set_locale
    parsed_locale = params[:locale] || 'en'
    I18n.locale = I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale : nil
  end
end

(これは、インターネット上のどこかで見つけたソリューションを少し調整したバージョンです。)

ほとんどの場所でうまく機能しました。ただし、パーシャルでパスヘルパーを使用していたときに、「パーシャルがありません」エラーの原因であることが判明しました。

<%= item_path(item) %>

役立つ回避策は、上記の行を次のように置き換えることでした。

<%= item_path(item, locale: params[:locale]) %>

default_url_optionsこの場合、なぜ動作しないのか、なぜRailsがそのような奇妙な例外を発生させたのか、私にはわかりません。

<% self.formats = [:html, :json] %>上記で提案した解決策は、エラー メッセージをより明確にしただけなので、少なくとも 'ルートが一致しません...' でスローされるように変更されましたitem_path

于 2012-12-16T11:11:08.327 に答える
1

渡ってみる

:format => :html

それ以外の

:formats => [:html]
于 2012-12-04T22:41:55.190 に答える