嵌套路由不适用于编辑和删除rails4

时间:2016-11-03 18:13:29

标签: ruby-on-rails controller routing nested

我正在尝试编辑和删除我的图书展示页面的书评,但是当我转到编辑页面时,它会使图书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

1 个答案:

答案 0 :(得分:0)

嵌套您的资源,如下所示:

的routes.rb

resources :books do
       resources :reviews do

这将允许您拥有类似于您想要的路线:

/书籍/ 1 /评论/ 37 /编辑

你的参数看起来像

{books_id:'1', id:'37'}

顺便说一下,如果使用资源创建路径,它们将自动设置为控制器上的create,show,update,delete方法,无需将它们设置为特定方法(并且需要清洁控制器)。