我正在尝试编辑和删除我的图书展示页面的书评,但是当我转到编辑页面时,它会使图书ID与评论ID相同。我无法弄清楚如何捕获两个参数并将它们传递给控制器。
例如,我在
/书籍/ 1
然后点击编辑到该页面上的其中一条评论,它就转到了
/书籍/ 37 /评论/ 37 /编辑
但它应该带我去
/书籍/ 1 /评论/ 37 /编辑
然后在编辑后遇到错误,因为book.id 37不存在说没有路线匹配[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)
我尝试了许多不同的可能的param语法,[:id],没有@等等。但它没有工作。
评论控制器
class ReviewsController&lt; ApplicationController中
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
我想到的每一种排列的方法,它也不起作用。
我还改变了是否在编辑,更新或销毁之前运行set_book和current_review方法,并且没有任何组合是正确的。
评论模型 - 我认为不相关,但如果需要别的东西......
class Review < ActiveRecord::Base
belongs_to :book
belongs_to :user
has_closure_tree order: 'created_at DESC'
end
_review.html.erb我刚刚意识到按钮本身可能存在的问题,这可能是有问题的代码
<% 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
答案 0 :(得分:0)
嵌套您的资源,如下所示:
的routes.rb
resources :books do
resources :reviews do
这将允许您拥有类似于您想要的路线:
/书籍/ 1 /评论/ 37 /编辑
你的参数看起来像
{books_id:'1', id:'37'}
顺便说一下,如果使用资源创建路径,它们将自动设置为控制器上的create,show,update,delete方法,无需将它们设置为特定方法(并且需要清洁控制器)。