【问题标题】:routes when nested resource and nested attribute嵌套资源和嵌套属性时的路由
【发布时间】:2013-09-16 11:21:44
【问题描述】:

我有一个 Review 模型,它是 Publication 模型的嵌套资源。审查模型有 accept_nested_attributes_for review_cmets。我想知道如何显示删除 review_commment 的删除路径?

<% @review.review_comments.each do |review_comment| %>
   <%= link_to "delete", ???,  method: :delete %>
<% end %>

review.rb

has_many :review_comments, :dependent => :destroy
accepts_nested_attributes_for :review_comments, :allow_destroy => :true

review_comment.rb

belongs_to :review

publication.rb

has_many :reviews

routes.rb

resources :publications do
  resources :reviews 
end

resources :review_comments

更新

def create
 @review_comment = ReviewComment.new(params[:review_comment])
  if @review_comment.save
    redirect_to @review_comment, notice: 'Review comment was successfully created.'
   ....
end

def destroy
  @review_comment = ReviewComment.find(params[:id])
  @review_comment.destroy
  redirect_to :back, notice: "Deleted" 
end

更新

 review_comments GET      /review_comments(.:format)                               review_comments#index
                       POST     /review_comments(.:format)                               review_comments#create
    new_review_comment GET      /review_comments/new(.:format)                           review_comments#new
   edit_review_comment GET      /review_comments/:id/edit(.:format)                      review_comments#edit
        review_comment GET      /review_comments/:id(.:format)                           review_comments#show
                       PUT      /review_comments/:id(.:format)                           review_comments#update
                       DELETE   /review_comments/:id(.:format)                           review_comments#destroy

【问题讨论】:

  • 你有 review_cmets 控制器吗?
  • 我有,在这个控制器中我有创建和删除操作
  • 你能粘贴你的review_cmets_controller.rb文件的内容吗?
  • 好的。我更新了问题
  • 你需要创建 app/controllers/review_cmets_controller.rb 并将我的帖子中的代码放在那里。

标签: ruby-on-rails ruby ruby-on-rails-3 routes


【解决方案1】:

link_to 使用 GET 以外的任何方法实际上是一个坏主意,因为可以右键单击链接并在新选项卡/窗口中打开,并且因为这只是复制 url(而不是方法),它会因非- 获取链接。

此外,网页索引蜘蛛会点击链接,即使有问题的链接可能只对登录用户可用(因此蜘蛛不可用),但它仍然是不好的做法。

最好使用 button_to 代替,这会使 rails 生成一个迷你表单来产生相同的结果。

从实用的角度来看,按钮更好(出于上述原因),但从概念的角度来看,它们也更好:一般来说,链接应该“带你去某个地方”,而按钮应该“做某事”。最好将这两个基本功能分开。

类似的,

button_to t('general.delete'), :review_comment_path(review_comment), :method => :delete, :confirm => t('review_comment.confirm_delete'), :title => t('review_comment.delete_question')

【讨论】:

    【解决方案2】:

    对于您的路线:

    <%= link_to "delete", review_comment,  method: :delete %>
    
    
    class ReviewCommentsController < ApplicationController
      def destroy
        @review_comment = ReviewComment.find(params[:id])
        @review_comment.destroy
        redirect_to review_comments_path # Or another path
      end
    end
    

    【讨论】:

    • 这是我尝试的第一个选项。不起作用。路由错误未初始化常量 ReviewCommentsController
    • 你可以定义 ReviewCommentsController 并在那里定义destroy方法。
    • 请在您的问题中更新模型 review_comment.rb 和 review_cmets_controller.rb
    • 他们在我的问题中。这是简单的关联,在控制器中销毁和创建操作。就是这样。
    最近更新 更多