Я пытаюсь проверить действия в спецификации контроллера, но по какой-то причине я получаю ошибки маршрутов без ошибок. Что мне делать, чтобы маршрут работал?rails + спецификация контроллера rspec с полиморфной ассоциацией
ActionController::UrlGenerationError:
No route matches {:action=>"create", :comment=>{:body=>"Consectetur quo accusamus ea.",
:commentable=>"4"}, :controller=>"comments", :post_id=>"4"}
модели
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true, touch: true
class Post < ActiveRecord::Base
has_many :comments, as: :commentable, dependent: :destroy
маршруты
resources :posts do
resources :comments, only: [:create, :update, :destroy], module: :posts
end
controller_spec
describe "POST create" do
let!(:user) { create(:user) }
let!(:profile) { create(:profile, user: @user) }
let!(:commentable) { create(:post, user: @user) }
context "with valid attributes" do
subject(:create_action) { xhr :post, :create, post_id: commentable, comment: attributes_for(:comment, commentable: commentable, user: @user) }
it "saves the new task in the db" do
expect{ create_action }.to change{ Comment.count }.by(1)
end
...
РЕДАКТИРОВАТЬ
controller_spec сверху можно найти в spec/controllers/comments_controller_spec.rb
контроллеры/comments_controller.rb
class CommentsController < ApplicationController
before_action :authenticate_user!
def create
@comment = @commentable.comments.new(comment_params)
authorize @comment
@comment.user = current_user
if @comment.save
@comment.send_comment_creation_notification(@commentable)
respond_to :js
end
end
контроллеры/сообщений/comments_controller.rb
class Posts::CommentsController < CommentsController
before_action :set_commentable
private
def set_commentable
@commentable = Post.find(params[:post_id])
end
max, u справа, мои маршруты могут использоваться без вложенности для обновления/уничтожения. Я обновил свой ответ с помощью моей установки действий. Я бы сохранил код создания комментария в 'CommentsController' вместо' Posts :: CommentsController', как вы можете видеть в обновленном вопросе. У меня также есть комментарии к продукту, так что этого достаточно, чтобы поместить 'set_post' или' set_product' в контроллеры модулей, и я могу сохранить основную часть действия create в 'CommentsController'. Как вы думаете? Можете ли вы рассказать мне, как я могу проверить это, если у меня есть половина кода здесь и половина? Btw. в dev env все работает нормально. –
max, pls также см. Мой предыдущий комментарий. Таким образом, я просто вложил свой контроллер, как вы посоветовали для создания действия, и это сработало. THX –
Приятно, что это сработало - см. Мое редактирование для некоторых советов о том, как его проверить. – max