RoR:使用没有AR模型的form_tag

时间:2011-03-01 21:43:32

标签: ruby-on-rails-3 forms

我需要提供一个没有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"}

2 个答案:

答案 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

...并且任何特殊的凭证处理都存在于服务模型中(应该如此)。