2

ユーザーがメールを入力してデータベースに保存できるフォームを作成しようとしています。すべてのページのフッターにこのフォームが必要です。

Rails scaffolding を介して NewsletterSignup を生成しました。

/app/views/refinery/_footer.html.erb に次のコードがあります。

<%= form_for(@newsletter_signup) do |f| %>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

ページを読み込もうとすると、次のエラーが発生します。

 NoMethodError in Refinery/pages#home

Showing /Users/tomcaflisch/Sites/PersonalTrainingKT/app/views/refinery/_form.html.erb where line #1 raised:

undefined method `newsletter_signups_path' for #<#<Class:0x007fb84c769ba0>:0x007fb84c08d110>

メソッドが定義されていないのはなぜですか? rake routes を実行すると、存在することがわかります:

newsletter_signups GET    /newsletter_signups(.:format)          newsletter_signups#index
                       POST   /newsletter_signups(.:format)          newsletter_signups#create
 new_newsletter_signup GET    /newsletter_signups/new(.:format)      newsletter_signups#new
edit_newsletter_signup GET    /newsletter_signups/:id/edit(.:format) newsletter_signups#edit
     newsletter_signup GET    /newsletter_signups/:id(.:format)      newsletter_signups#show
                       PUT    /newsletter_signups/:id(.:format)      newsletter_signups#update
                       DELETE /newsletter_signups/:id(.:format)      newsletter_signups#destroy

ルート.rb

PersonalTrainingKT::Application.routes.draw do

  resources :newsletter_signups

  # This line mounts Refinery's routes at the root of your application.
  # This means, any requests to the root URL of your application will go to Refinery::PagesController#home.
  # If you would like to change where this extension is mounted, simply change the :at option to something different.
  #
  # We ask that you don't use the :as option here, as Refinery relies on it being the default of "refinery"
  mount Refinery::Core::Engine, :at => '/'
end

また、このニュースレターのサインアップはすべてのページで利用できるようになるため、application_controller に新しいオブジェクトを作成しています。

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :instantiate_newsletter_signup

  def instantiate_newsletter_signup
    @newsletter_signup = NewsletterSignup.new
  end
end
4

1 に答える 1

5

これは、refinerycms がルートをマウントするため (用語が正しいかどうかはわかりません)、通常のルートを認識できないようです。

このリンクからhttps://groups.google.com/forum/#!topic/refinery-cms/5k7Co4D1bVI変更する必要があることがわかりました

<%= form_for(@newsletter_signup, :url => newsletter_signups_path, :method => :post) do |f| %>

<%= form_for(@newsletter_signup, :url => main_app.newsletter_signups_path, :method => :post) do |f| %>
于 2012-07-26T04:09:48.910 に答える