記事1
を参考にRailsでお仕事辞退機能(辞退理由を送信する)を実装中に以下のエラーに遭遇しました。
NoMethodError in Cancels#new
Showing /Users/me/environment/アプリ名/app/views/cancels/new.html.erb where line #1 raised:
undefined method `cancels_path' for #<ActionView::Base:0x0000000001d308>
recipient.public_send(method, *args, options)
^^^^^^^^^^^^
以下がコードになります。
config/routes.rb
Rails.application.routes.draw do
resources :jobs, only: [:new, :create, :edit, :index, :show, :destroy] do
resource :applicants, only: [:create, :destroy]
resource :cancels, only: [:create, :new, :destroy]
end
root "home#top"
resources :users, only: [:new, :create, :edit, :destroy, :update]
# post "users/create" => "users#create", as: "create_users"
# get "users/:id/edit" => "users#edit", as:"edit_users"
# post "users/:id/update" => "users#update", as:"update_users"
get "signup", to: "users#new", as: "new_users"
resources :guest_sessions, only: [:create]
# post "guest_login", to: "guest_sessions#guest_login"
# get "guest_login", to: "guest_sessions#guest_login"
post "logout" => "sessions#destroy"
# get "logout" => "sessions#destroy"
get "login", to: "sessions#new", as: "new_sessions"
post "login", to: "sessions#create", as: "create_sessions"
delete "logout", to: "sessions#destroy", as: "destroy_sessions"
# get "users/:id/destroy", to: "users#destroy"
# delete "users/:id/destroy", to: "users#destroy", as: "destroy_users"
end
$ rails routes
Prefix Verb URI Pattern Controller#Action
job_applicants DELETE /jobs/:job_id/applicants(.:format) applicants#destroy
POST /jobs/:job_id/applicants(.:format) applicants#create
new_job_cancels GET /jobs/:job_id/cancels/new(.:format) cancels#new
job_cancels DELETE /jobs/:job_id/cancels(.:format) cancels#destroy
POST /jobs/:job_id/cancels(.:format) cancels#create
jobs GET /jobs(.:format) jobs#index
POST /jobs(.:format) jobs#create
new_job GET /jobs/new(.:format) jobs#new
edit_job GET /jobs/:id/edit(.:format) jobs#edit
job GET /jobs/:id(.:format) jobs#show
DELETE /jobs/:id(.:format) jobs#destroy
root GET / home#top
users POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
new_users GET /signup(.:format) users#new
guest_sessions POST /guest_sessions(.:format) guest_sessions#create
logout POST /logout(.:format) sessions#destroy
new_sessions GET /login(.:format) sessions#new
create_sessions POST /login(.:format) sessions#create
destroy_sessions DELETE /logout(.:format) sessions#destroy
rails_postmark_inbound_emails POST /rails/action_mailbox/postmark/inbound_emails(.:format) action_mailbox/ingresses/postmark/inbound_emails#create
rails_relay_inbound_emails POST /rails/action_mailbox/relay/inbound_emails(.:format) action_mailbox/ingresses/relay/inbound_emails#create
rails_sendgrid_inbound_emails POST /rails/action_mailbox/sendgrid/inbound_emails(.:format) action_mailbox/ingresses/sendgrid/inbound_emails#create
rails_mandrill_inbound_health_check GET /rails/action_mailbox/mandrill/inbound_emails(.:format) action_mailbox/ingresses/mandrill/inbound_emails#health_check
rails_mandrill_inbound_emails POST /rails/action_mailbox/mandrill/inbound_emails(.:format) action_mailbox/ingresses/mandrill/inbound_emails#create
rails_mailgun_inbound_emails POST /rails/action_mailbox/mailgun/inbound_emails/mime(.:format) action_mailbox/ingresses/mailgun/inbound_emails#create
rails_conductor_inbound_emails GET /rails/conductor/action_mailbox/inbound_emails(.:format) rails/conductor/action_mailbox/inbound_emails#index
POST /rails/conductor/action_mailbox/inbound_emails(.:format) rails/conductor/action_mailbox/inbound_emails#create
new_rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/new(.:format) rails/conductor/action_mailbox/inbound_emails#new
edit_rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/:id/edit(.:format) rails/conductor/action_mailbox/inbound_emails#edit
rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#show
PATCH /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#update
PUT /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#update
DELETE /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#destroy
new_rails_conductor_inbound_email_source GET /rails/conductor/action_mailbox/inbound_emails/sources/new(.:format) rails/conductor/action_mailbox/inbound_emails/sources#new
rails_conductor_inbound_email_sources POST /rails/conductor/action_mailbox/inbound_emails/sources(.:format) rails/conductor/action_mailbox/inbound_emails/sources#create
rails_conductor_inbound_email_reroute POST /rails/conductor/action_mailbox/:inbound_email_id/reroute(.:format) rails/conductor/action_mailbox/reroutes#create
rails_conductor_inbound_email_incinerate POST /rails/conductor/action_mailbox/:inbound_email_id/incinerate(.:format) rails/conductor/action_mailbox/incinerates#create
rails_service_blob GET /rails/active_storage/blobs/redirect/:signed_id/*filename(.:format) active_storage/blobs/redirect#show
rails_service_blob_proxy GET /rails/active_storage/blobs/proxy/:signed_id/*filename(.:format) active_storage/blobs/proxy#show
GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs/redirect#show
rails_blob_representation GET /rails/active_storage/representations/redirect/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/redirect#show
rails_blob_representation_proxy GET /rails/active_storage/representations/proxy/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/proxy#show
GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations/redirect#show
rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show
update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update
rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create
app/controllers/cancels_controller.rb
class CancelsController < ApplicationController
def show
@job = Job.find_by(id: params[:id])
end
def new
@cancel = Cancel.new
end
def create
Cancel.create(cancel_params)
redirect_to root_path
end
private
def cancel_params
params.require(:cancel).permit(:reason).merge(user_id: @current_user.id)
end
end
app/views/cancels/new.html.erb
<%= form_with(model: @cancel) do |f| %>
<%= f.text_area(:reason, placeholder: "辞退理由を入力") %>
<%= f.submit("辞退理由を送信") %>
<% end %>
記事2
によると、
調べると、以上の「= form_with model: @review, local: true do |f|」のコードにおいては、form_with model: @review の箇所が内部的にpolymorphic_path(@review)というメソッドを実行しているそうで、 その実行結果がreviews_pathとなるのでそこでエラーが起きているらしい。
ということで、パスが意図せず作られてしまう(?)ことで発生するエラーのようです。
記事3
では、アソシエーションの設定が上手くできていない可能性があると書かれており、チェックしてみましたが特におかしい点は見当たりませんでした。
記事2
ではform_for
で解決していますが、form_for
は現在では非推奨なので、以下のようにしたところ一応エラーは出なくなりました。
app/views/cancels/new.html.erb
<%= form_with(url: job_cancels_path) do |f| %>
<%= f.text_area(:reason, placeholder: "辞退理由を入力") %>
<%= f.submit("辞退理由を送信") %>
<% end %>