我在我的应用中使用'refinerycms-queries'宝石来在我的联系页面上进行查询。
我遇到的问题是虽然我可以使用其他页面上的<%= raw @page.content_for(:body) %>
代码来呈现内容,但我不知道为什么我会在查询#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 / queries / queries / 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" %>
这是我的inquiries_controller.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-queries'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
答案 0 :(得分:2)
看起来我发现了问题。
事实证明来自queries_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内容。我也注意到通过这个修改并且不需要在我的refinery / queries / queries / new.html.erb文件中明确指定来呈现content_for(:body)。
所以新视图看起来像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" %>
希望如果有人遇到同样的问题,这会有所帮助。
答案 1 :(得分:0)
问题是在相应的控制器操作中缺少@page的定义(在您的情况下为'new'和'create')。我可以看到@inquiry实例化。尝试添加声明
@page = ::Refinery::Page.find_by_link_url("/contact")
在InquriesController的'new'和'create'动作中。
我有点好奇,你正在使用什么版本的炼油厂? (奇怪的是,refinerycms-queries gem在routes.rb中生成一个内容,假设它是一个可安装的引擎)。