首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >路由错误:没有路由匹配[PUT]“/目标值/4/编辑”

路由错误:没有路由匹配[PUT]“/目标值/4/编辑”
EN

Stack Overflow用户
提问于 2014-06-22 15:31:20
回答 2查看 470关注 0票数 0

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

代码语言:javascript
复制
=form_tag edit_goal_path(goal), method: :post do
  =hidden_field_tag :purchased, value: true
  =submit_tag "Purchase"

这是haml,但请随时与再培训局发表建议。我得到了以下错误:

代码语言:javascript
复制
No route matches [POST] "/goals/4/edit"
Rails.root: /home/ben/rails_projects/hartwig

然而,我已经从资源中获得了以下途径:

代码语言:javascript
复制
PUT     /goals/:id(.:format)    goals#update 

我的控制器看起来如下:

代码语言:javascript
复制
  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

我怎么才能让这个起作用?还是有更好的方法来解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-22 16:20:15

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

在goals_controller.rb中

代码语言:javascript
复制
def purchase
@goal.update_attribute(:purchased, true)
end

并在顶部添加(只需添加:购买)

代码语言:javascript
复制
before_action :set_goal, only: [:show, :edit, :update, :destroy, :purchase]

在routes.rb中更改为

代码语言:javascript
复制
resources :goals do
 member do
  post 'purchase'
 end
end

要将新的帖子路径添加到您的目标中,现在您可以在视图中使用一个purchase_goal_path,如下所示:

代码语言:javascript
复制
link_to 'Purchase', purchase_goal_path(@goal), method: :post
票数 1
EN

Stack Overflow用户

发布于 2014-06-22 16:42:14

你的问题是:

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

那你为什么要用表格来做呢?我认为更好的方法是创建一个链接或按钮,通过post路由调用ajax方法普通方法并更新属性。您可以通过以下步骤实现这一目标:

a.为您的自定义操作创建一个路由,在这里您将更新属性:

代码语言:javascript
复制
post 'purchase_update/:id' => "goal#update_purchase", as: update_purchase  #post as you want to send your goal id

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

代码语言:javascript
复制
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.创建将调用此方法的链接:

代码语言:javascript
复制
=link_to "Purchase", update_purchase_path(@goal), method: post

如果你想用ajax来做

代码语言:javascript
复制
=link_to "Purchase", update_purchase_path(@goal), method: post, remote: true
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24352784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档