【发布时间】:2016-11-03 18:13:28
【问题描述】:
我正在尝试编辑和删除我的图书展示页面的书评,但是当我路由到编辑页面时,它使图书 ID 与评论 ID 相同。我不知道如何捕获这两个参数并将它们传递给控制器。
比如我在上
/books/1
然后我点击编辑该页面上的其中一条评论,然后它会带我去
/books/37/reviews/37/edit
但它应该带我去
/books/1/reviews/37/edit
然后在编辑后遇到错误,因为 book.id 37 不存在说 No route matches [POST] "/books/37/reviews/37" 这是有道理的
这是代码。正在正确进行审核,因此嵌套路线一定有问题。我想。
routes.rb
get "/books/:id/reviews/:id/edit", to: "reviews#edit", as: "review_edit"
patch "/books/:id/reviews/:id", to: "reviews#update"
delete "/books/:id/reviews/:id", to: "reviews#destroy", as: "delete_review"
编辑审核表
<%= form_for :review, url: {action: "update"} do |f| %>
<h1 class="text-center">Edit yout thought</h1>
<%= f.text_area :body, required: true, class: "form-control"%>
<%= f.hidden_field :book_id, value: params[:id] %>
<%= f.hidden_field :parent_id %>
<div class="form-group">
<%= f.check_box(:spoiler) %>
<%= label_tag( "SPOILER ALERT") %>
<%= f.submit "Edit Thought", class: "btn btn-primary pull-right" %>
</div>
<% end %>
我试过改
url: {action: "update"}
到
url: review_edit_path(@book.id, review.id)
我尝试了许多不同的可能参数语法 [:id],没有 @ 等。但它不起作用。
评论控制器
类评论控制器 我把整个控制器放进去,这样你就可以看到什么工作了。这里我改了 我能想到的每个排列的方法,它也不起作用。 我还更改了 set_book 和 current_review 方法是否在编辑、更新或销毁之前运行,但没有任何组合是正确的。 审查模型 - 我认为不相关,但如果需要其他东西...... _review.html.erb 我刚刚意识到问题可能出在按钮本身,这可能是有问题的代码 编辑评论的请求来自书展,所以这里是书展方法,以防万一。 before_action :set_user, only: [:index, :create]
before_action :set_book, only: [:new, :create, :edit, :update]
before_action :current_review, only: [:update, :destroy]
def index
@reviews = Review.hash_tree
end
def new
@review = Review.new(parent_id: params[:parent_id])
end
def create
if params[:review][:parent_id].to_i > 0
parent = Review.find_by_id(params[:review].delete(:parent_id))
@review = parent.children.build(review_params)
@review.user = current_user
else
@review = Review.new(review_params)
@review.user = current_user
end
if @review.save
flash[:success] = 'Your comment was successfully added!'
else
render 'new'
end
redirect_to book_path(@book)
end
def edit
end
def update
@review.update_attributes(review_params)
end
def destroy
@review.destroy
end
private
def review_params
params.require(:review).permit(:body, :spoiler, :book_id, :user_id)
end
def set_book
@book = Book.find_by_id(params[:id])
end
def current_review
@review = Review.find_by_id(params[:review_id])
end
end
def current_review
class Review < ActiveRecord::Base
belongs_to :book
belongs_to :user
has_closure_tree order: 'created_at DESC'
end
<% if review.user.id == session[:user_id] %>
<%= link_to "Edit", review_edit_path(@book.id, review.id), method: "get", class: "pull-right btn btn-primary col-xs-2" %>
<%= link_to "Delete", delete_review_path(@book.id, review.id) ,method: :delete, data: {confirm: "Are you sure you want to delete ythis review?"}, class: "btn btn-danger col-xs-2 pull-right" %>
<% end %>
def show
@reviews = Review.hash_tree
end
【问题讨论】:
-
转到guides.rubyonrails.org/routing.html,从
2.7 Nested Resources开始阅读,基本上每个id都需要使用不同的标识符。 -
我去看看,我读了一个不同的文档,这个似乎更有帮助
标签: ruby-on-rails controller routing nested