我有一個Rails應用程序,它有三個主要模型:Qn,Ans和Comments。我一直在做1層深的嵌套資源,但這三個資源是深嵌套(評論是淺層嵌套),他們都顯示在單一視圖,這使得它很混亂。在Rails 5中添加評論文章(深度嵌套資源)
在一個像這樣的網址:http://localhost:3000/questions/2,用戶可以看到所有使用循環顯示的問題:@ question.answers。在每個這些答案中,用戶可以看到使用循環顯示的answer.comments。在每個回答以下,用戶也可以提交新評論。
但嘗試多次實施1)循環顯示所有評論和2)形式的新評論後,我總是得到的線沿線的一些錯誤:
undefined method `model_name' for {:url=>"https://stackoverflow.com/questions/4/answers/2/comments/new"}:Hash
於是,我就在PARAMS通過@commentable而不是答案,或指向特定控制器和操作等,但這些方法都沒有工作。我猜測我的控制器有一個問題,但我似乎無法弄清楚。
routes.rb中(上中省略)
# Resources
resources :sessions
resources :users
resources :bookmarks # to be implemented later
resources :questions do
resources :answers do
resources :comments, shallow: true
end
end
問題模型
class Question < ApplicationRecord
has_many :answers
has_many :bookmarks #later
end
答型號:
class Answer < ApplicationRecord
belongs_to :question
has_many :comments, as: :commentable
has_many :likes, as: :likeable
validates :answercontent, length: {minimum: 50}
end
Comment模型:
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
的show.html。ERB(的QuestionsController)
<% @question.answers.each do |answer| %>
// ommited
<!-- Comments -->
<% answer.comments.each do |comment| %>
<%= comment.content %>
<br>
<% end %>
<!-- Submit new comment -->
<%= form_for(url: new_question_answer_comment_path, comment: {answer_id: answer.id, question_id: @question.id}) do |f| %>
<%= f.text_area :content %>
<%= f.submit "Submit" %>
<% end %>
<% end %>
QuestionsController(新,創建,銷燬中省略爲簡潔起見)
class QuestionsController < ApplicationController
def index
@questions = Question.all
end
def show
@question = Question.find(params[:id])
@answers = Answer.all
# Delete only appears when num_ans is 0
@deletable = (current_user== User.find(@question.user_id)) && (@question.answers.all.size==0)
end
private
def question_params
params.require(:question).permit(:picture_url, :country, :educational_level, :topic)
end
end
AnswersController(編輯,更新,破壞中省略爲簡潔起見)
class AnswersController < ApplicationController
def create
@question = Question.find(params[:question_id])
@answer = @question.answers.create(answer_params)
@answer.question_id = @question.id
@answer.user_id = current_user.id
if @answer.save
redirect_to @question
else
render :new
end
end
private
def answer_params
params.require(:answer).permit(:user_id, :question_id, :answercontent)
end
end
評論控制器
class CommentsController < ApplicationController
before_filter: load_commentable
def index
@commentable = Answer.find(params[:answer_id])
@comments = @commentable.comments
end
def new
@comment = @commentable.comments.new
end
def create
@comment = @commentable.comments.new(params[:comment])
if @comment.save
redirect_to @commentable
else
render :new
end
end
# From RailsCast ep.154
private
def load_commentable
resource, id = request.path.split('/')[1,2]
@commentable = resource.singularize.classify.constantize.find(id)
end
end
的路由 現在是相當混亂,所以我將只是張貼在那裏的意見是:提前爲幫助
question_answer_comments GET /questions/:question_id/answers/:answer_id/comments(.:format) comments#index
POST /questions/:question_id/answers/:answer_id/comments(.:format) comments#create
new_question_answer_comment GET /questions/:question_id/answers/:answer_id/comments/new(.:format) comments#new
edit_comment GET /comments/:id/edit(.:format) comments#edit
comment GET /comments/:id(.:format) comments#show
PATCH /comments/:id(.:format) comments#update
PUT /comments/:id(.:format) comments#update
DELETE /comments/:id(.:format) comments#destroy
感謝。
更新:
爲了讓你對我有什麼企圖解決方案的更多信息: 1.傳遞兩個參數,如:
<%= form_for([answer, @comment], url: new_question_answer_comment_path(answer.id, @question.id)) do |f| %>
遞給我:
First argument in form cannot contain nil or be empty
- 使用@commentable(這基本上是答案)給了我一個錯誤,說'@ commentable.id中的id不存在@commentable沒有'。
所以我覺得這個問題是答案或@commentable爲零。但是我也在循環和控制器中指定了它。那麼我還有什麼可以嘗試的?
表單上的路由不應該是'question_answer_comments_path'而不是'new_question_answer_comments_path'? –
@KarthikRavichandran要創建一條新評論,那就是實際使用的路線。 – Pavan
@KarthikRavichandran你說得對,其實我的錯誤 – Pavan