我正在尝试创建一个按钮,将模型记录属性从false更改为true。我使用的form_tag如下所示:
=form_tag edit_goal_path(goal), method: :post do
=hidden_field_tag :purchased, value: true
=submit_tag "Purchase"这是haml,但请随时与再培训局发表建议。我得到了以下错误:
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我怎么才能让这个起作用?还是有更好的方法来解决这个问题?
发布于 2014-06-22 16:20:15
解决问题的另一个解决方案可能是向目标控制器添加一个新方法:
在goals_controller.rb中
def purchase
@goal.update_attribute(:purchased, true)
end并在顶部添加(只需添加:购买)
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发布于 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.为您的自定义操作创建一个路由,在这里您将更新属性:
post 'purchase_update/:id' => "goal#update_purchase", as: update_purchase #post as you want to send your goal idb.在控制器内创建自定义方法:
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
endc.创建将调用此方法的链接:
=link_to "Purchase", update_purchase_path(@goal), method: post如果你想用ajax来做
=link_to "Purchase", update_purchase_path(@goal), method: post, remote: truehttps://stackoverflow.com/questions/24352784
复制相似问题