我需要提供一个没有AR模型支持的表单。 (我知道这个问题已经以各种方式被问了好几次,但是尽管有很多阅读实验,我仍然无法做到正确。)
描述我需要的最简单的方法是通过逆向工程:假设我想要一个带有“用户名”字段和“访问码”字段的表单。然后我想要[提交]按钮来呼叫:
ServicesController#update
将params哈希设置为(至少):
params={"service"=>{"credentials"=>{"username"=>"fred", "accesscode"=>"1234"}}, "commit"=>"update credentials", "action"=>"update", "controller"=>"services", "id"=>"54"}
或者只是
params={"credentials"=>{"username"=>"fred", "accesscode"=>"1234"}, "commit"=>"update credentials", "action"=>"update", "controller"=>"services", "id"=>"54"}
其中'54'是我想要更新的Services对象的id。 (我的update()方法会从params散列中取出凭证并用它们做正确的事。)(我没有显示路线,但我不确定这里是否相关。)
但我还没弄明白如何让form_tag或form_for出价。建议?
更新 根据下面的光圈建议,form_tag似乎是正确的。我收到路由错误“没有路由匹配”/ services / 54“'。在我修改当前路线之前,我目前有:
resources :premises, :shallow => true do
resources :services
end
给了我(部分):
edit_service GET /services/:id/edit(.:format) {:action=>"edit", :controller=>"services"}
service GET /services/:id(.:format) {:action=>"show", :controller=>"services"}
PUT /services/:id(.:format) {:action=>"update", :controller=>"services"}
DELETE /services/:id(.:format) {:action=>"destroy", :controller=>"services"}
答案 0 :(得分:1)
的routes.rb
match '/services/update/:id', :to => 'services#update', :as => 'update_service'
然后你的表格:
- form_tag @service, :url => update_service_path do = text_field :credentials, :userid, 'value' => 'fred' = text_field :credentials, :accessid, 'value' => '1234'
然后在你的控制器中:
def update @service = Service.find_by_id(params[:id]) @service.update_attribute('userid', params[:credentials][:userid]) @service.update_attribute('accessid', params[:credentials][:accessid]) end
如果它不是模型,我不知道Services对象是什么。所以我不知道通过id找到服务需要什么方法,如果不是模型,update_attribute调用可能不会起作用,但没有更多信息就很难说
这完全没有经过测试。但希望接近工作......
答案 1 :(得分:1)
我给@aperture添加了复选标记,但是在完成所有调整后,这是基于光圈指导的最终版本:
<%= form_tag @service, :url => service_path(@service), :method => :put do %>
<%= text_field :service, 'credentials[userid]' %>
<%= text_field :service, 'credentials[accessid]' %>
<%= submit_tag 'update credentials' %>
<% end %>
单击[submit]按钮最终调用Service#update()并将params哈希设置为:
params={... "_method"=>"put", "service"=>{"credentials"=>{"userid"=>"xxx", "accessid"=>"xxx"}}, "commit"=>"update credentials", "action"=>"update", "controller"=>"metered_services", "id"=>"54"}
请注意,我已经修改了@smore版本的text_field args - 这种方法将凭据包装在自己的凭证哈希中,因此Service#update方法可以是规范的:
def update
@service = Service.find(params[:id])
@premise = @service.premise
if (@service.update_attributes(params[:service]))
redirect_to edit_premise_path(@premise), :notice => 'info was successfully updated'
else
redirect_to edit_premise_path(@premise), :error => 'could not update information'
end
end
...并且任何特殊的凭证处理都存在于服务模型中(应该如此)。