3

アプリで「refinerycms-inquiries」ジェムを使用して、連絡先ページに問い合わせを表示しています。

私が得ている問題は<%= raw @page.content_for(:body) %>、他のページのコードを使用してコンテンツをレンダリングすることはできますが、inquiries#new ビューでこれを取得する理由がわからないことです。インターネットで数時間答えを探し、ソースコードを調べたので、誰かがこれをより迅速に解決するのを手伝ってくれるかもしれません。

これはエラーです:

 NoMethodError in Refinery/inquiries/inquiries#new 
undefined method `content_for' for nil:NilClass

Extracted source (around line #3):

1: <% content_for :body do %>
2:     <div>
3:       <%= raw @page.content_for(:body) %>
4:     </div>
5: <% end %>
6: 

私は製油所とRoRに少し慣れていないことに言及する必要があります。

これは私のRefinery/inquiries/inquiries/new.html.erbファイルです:

<% content_for :body do %>
    <div class="contact">
      <%= raw @page.content_for(:body) %>
    </div>
<% end %>

<% content_for :body_content_left do %>
    <div class='inquiries'>
      <%= form_for [refinery, :inquiries, @inquiry] do |f| %>
          <%= render :partial => "/refinery/admin/error_messages",
                     :locals => {
                             :object => @inquiry,
                             :include_object_name => true
                     } %>
          <div class="field">
            <%= f.required_label :name, :class => 'placeholder-fallback' %>
            <%= f.text_field :name, :class => 'text', :required => 'required', :placeholder => t('name', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class="field">
            <%= f.required_label :email, :class => 'placeholder-fallback' %>
            <%= f.email_field :email, :class => 'text email', :required => 'required', :placeholder => t('email', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class="field">
            <%= f.label :phone, :class => 'placeholder-fallback' %>
            <%= f.text_field :phone, :class => 'text phone', :placeholder => t('phone', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class='field message_field'>
            <%= f.required_label :message, :class => 'placeholder-fallback' %>
            <%= f.text_area :message, :rows => 8, :required => 'required', :placeholder => t('message', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class="actions">
            <%= f.submit t('.send') %>
          </div>
      <% end %>
    </div>
<% end %>
<%= render :partial => "/refinery/content_page" %>

これは私の照会_コントローラー.rbです:

module Refinery
  module Inquiries
    class InquiriesController < ::ApplicationController

      before_filter :find_page, :only => [:create, :new]

      def thank_you
        @page = ::Refinery::Page.find_by_link_url("/contact/thank_you")
      end

      def new
        @inquiry = ::Refinery::Inquiries::Inquiry.new
      end

      def create
        @inquiry = ::Refinery::Inquiries::Inquiry.new(params[:inquiry])

        if @inquiry.save
          if @inquiry.ham?
            begin
              ::Refinery::Inquiries::InquiryMailer.notification(@inquiry, request).deliver
            rescue
              logger.warn "There was an error delivering an inquiry notification.\n#{$!}\n"
            end

            begin
              ::Refinery::Inquiries::InquiryMailer.confirmation(@inquiry, request).deliver
            rescue
              logger.warn "There was an error delivering an inquiry confirmation:\n#{$!}\n"
            end if ::Refinery::Inquiries::Setting.send_confirmation?
          end

          redirect_to refinery.thank_you_inquiries_inquiries_path
        else
          render :action => 'new'
        end
      end

      protected

      def find_page
        @page = ::Refinery::Page.find_by_link_url("/contact")
      end

    end
  end
end

そして、「refinerycms-inquiries」gem によって生成される config/routes.rb 部分は次のとおりです。

Refinery::Core::Engine.routes.draw do
    namespace :inquiries, :path => '' do
      get '/contact', :to => 'inquiries#new', :as => 'new_inquiry'

      resources :contact,
                :only => :create,
                :as => :inquiries,
                :controller => 'inquiries' do
        get :thank_you, :on => :collection
      end

      namespace :admin, :path => 'refinery' do
        resources :inquiries, :only => [:index, :show, :destroy] do
          get :spam, :on => :collection
          get :toggle_spam, :on => :member
        end

        scope :path => 'inquiries' do
          resources :settings, :only => [:edit, :update]
        end
      end
    end
  end
4

2 に答える 2

2

問題を見つけたようです。

inquiries_controllerの::Refinery:: Page.find_by_urlメソッドがnilを返し、find_pageメソッドとthank_youメソッドを次のように書き直す必要がありました。

  def thank_you
     @page = ::Refinery::Page.find_by_path("/contact/thank_you")
  end

  def find_page
     @page = ::Refinery::Page.find_by_path(/contact")
  end

:bodyと:side_bodyのコンテンツを連絡先ビューに表示するため。また、この変更により、content_for(:body)をレンダリングするためにrefinery / inquiries / inquiries/new.html.erbファイルで明示的に指定する必要がないことにも気づきました。

したがって、新しいビューはgemのデフォルトのビューのようになります。

<% content_for :body_content_left do %>
    <div class='inquiries'>
      <%= form_for [refinery, :inquiries, @inquiry] do |f| %>
          <%= render :partial => "/refinery/admin/error_messages",
                     :locals => {
                             :object => @inquiry,
                             :include_object_name => true
                     } %>
          <div class="field">
            <%= f.required_label :name, :class => 'placeholder-fallback' %>
            <%= f.text_field :name, :class => 'text', :required => 'required', :placeholder => t('name', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class="field">
            <%= f.required_label :email, :class => 'placeholder-fallback' %>
            <%= f.email_field :email, :class => 'text email', :required => 'required', :placeholder => t('email', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class="field">
            <%= f.label :phone, :class => 'placeholder-fallback' %>
            <%= f.text_field :phone, :class => 'text phone', :placeholder => t('phone', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class='field message_field'>
            <%= f.required_label :message, :class => 'placeholder-fallback' %>
            <%= f.text_area :message, :rows => 8, :required => 'required', :placeholder => t('message', :scope => 'activerecord.attributes.refinery/inquiries/inquiry') %>
          </div>
          <div class="actions">
            <%= f.submit t('.send') %>
          </div>
      <% end %>
    </div>
<% end %>
<%= render :partial => "/refinery/content_page" %>

誰かが同じ問題に遭遇した場合、これが役立つことを願っています。

于 2012-12-20T23:20:25.510 に答える
0

問題は、対応するコントローラーのアクション (この場合は「新規」および「作成」) に @page の定義がありません。@inquiry がインスタンス化されていることがわかります。ステートメントを追加してみてください

 @page = ::Refinery::Page.find_by_link_url("/contact")

InquriesController の「新規」アクションと「作成」アクションの両方で。

ちょっと気になるのですが、使用しているRefineryのバージョンは何ですか? (refinerycms-inquiries gem が、マウント可能なエンジンであると仮定して、routes.rb にコンテンツを生成する方法が奇妙です) .

于 2012-12-20T16:01:41.493 に答える