【问题标题】:nested route not working for edit and delete rails4嵌套路线不适用于编辑和删除 rails4
【发布时间】: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],没有 @ 等。但它不起作用。

评论控制器

类评论控制器

        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

【问题讨论】:

  • 转到guides.rubyonrails.org/routing.html,从2.7 Nested Resources开始阅读,基本上每个id都需要使用不同的标识符。
  • 我去看看,我读了一个不同的文档,这个似乎更有帮助

标签: ruby-on-rails controller routing nested


【解决方案1】:

嵌套你的资源,像这样:

routes.rb

resources :books do
       resources :reviews do

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

/books/1/reviews/37/edit

你的参数看起来像

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

顺便说一句,如果您使用资源创建路由,它们将自动设置为控制器上的创建、显示、更新、删除方法,您无需将它们设置为特定方法(并且使更清洁的控制器)。

【讨论】:

  • 我的网站要开发回去并将我的路线切换到 Rails 自动脚手架版本。我必须改变我所有的观点誓言。如果我真的想不出另一种解决方案,我会尝试一下。我也喜欢在 routes.rb 文件中查看我的所有路线。脚手架的路线几乎可以为我清理。我知道您可以随时获取它们,但我喜欢能够在文件中看到它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多