【问题标题】:Routing Error: No route matches [PUT] "/goals/4/edit"路由错误:没有路由匹配 [PUT] "/goals/4/edit"
【发布时间】:2014-08-12 17:13:26
【问题描述】:

我正在尝试创建一个按钮来将模型记录属性从 false 更改为 true。我正在使用 form_tag 如下:

=form_tag edit_goal_path(goal), method: :post do
  =hidden_field_tag :purchased, value: true
  =submit_tag "Purchase"

这是 haml,但请随时使用 ERB 发布建议。我收到以下错误:

No route matches [POST] "/goals/4/edit"
Rails.root: /home/ben/rails_projects/hartwig

但是,我已经从资源中获得了以下路线:

PUT     /goals/:id(.:format)    goals#update 

我的控制器如下所示:

  def edit
    @goal = Goal.find(params[:id])
  end

  def update
    @goal = Goal.find(params[:id])
    if @goal.update_attributes(goal_params)
      redirect_to '/goals', notice: "Update successful!"
    else
      render '/'
    end
  end
  def goal_params
    params.require(:goal).permit(:item, :description, :picture, :purchased)
  end

如何让它工作?或者有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: ruby-on-rails routes put


    【解决方案1】:

    你的问题是:

    I am trying to create a button to change a model record attribute from false to true

    所以你为什么要使用表单?我认为更好的方法是创建一个链接或按钮,它会调用一个ajax方法 或带有发布路线的普通方法 并更新您的属性。您可以通过以下步骤来实现它:

    一个。为您的自定义操作创建一个路由,您将在其中更新您的属性:

    post 'purchase_update/:id' => "goal#update_purchase", as: update_purchase  #post as you want to send your goal id
    

    b.在控制器中创建自定义方法:

    def update_purchase
      @goal = Goal.find(params[:id])
      @goal.update_attribute(:purchased, true)
      respond_to do |format|
        format.html {redirect_to your_path, notice: 'purchase updated'}
        format.js {} #if you want to do something by ajax
      end
    end
    

    c。创建将调用此方法的链接:

    =link_to "Purchase", update_purchase_path(@goal), method: post
    

    如果你想通过 ajax 来做,那么

    =link_to "Purchase", update_purchase_path(@goal), method: post, remote: true
    

    【讨论】:

    • 我必须对您的帖子进行以下更改才能使其正常工作:goals#update_purchase as: :update_purchase 和 method: :post。但是,我收到来自 Firefox 的错误消息“损坏的内容错误:由于检测到数据传输错误,无法显示您尝试查看的页面。”我不知道如何避免。
    • @zenben1126 奇怪的是以前从未遇到过该错误,并且如果您希望您的操作响应不同类型的请求,则响应块存在
    【解决方案2】:

    您的问题的另一个解决方案可能是向目标控制器添加一个新方法:

    在goals_controller.rb中

    def purchase
    @goal.update_attribute(:purchased, true)
    end
    

    并在顶部添加(只需添加 :purchase)

    before_action :set_goal, only: [:show, :edit, :update, :destroy, :purchase]
    

    在 routes.rb 中更改为

    resources :goals do
     member do
      post 'purchase'
     end
    end
    

    为您的目标添加新的发布路线 现在您将拥有一个可以在视图中使用的 purchase_goal_path,如下所示:

    link_to 'Purchase', purchase_goal_path(@goal), method: :post
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多