Ruby on Rails - 预先填写新记录

时间:2010-08-09 15:41:19

标签: ruby-on-rails

我有一个嵌套资源的表单(Client:has_many Workouts),我希望根据一些用户输入预先填充(我使用此输入为新操作设置一些其他默认参数)。

<%  form_tag new_client_workout_path(@workout_user) do%>
    <%= date_select nil, :date %>
    <%= submit_tag 'Enter New Workout' %><br/>
<% end %>

如果我提交此表单,我会收到以下错误。

ActionController::MethodNotAllowed Only get, put, and delete requests are allowed.

我可以更新表单的get方法,哪个有效,但是我在查询字符串上有我不想要的所有表单参数。

有没有办法用帖子来完成这个?

当资源没有嵌套并且工作正常时,我做了类似的事情。

3 个答案:

答案 0 :(得分:1)

因此,据我了解,您希望将一个表单(如图所示)作为POST发送到控制器,这会导致呈现另一个表单,该表单预先填充了日期定向参数(来自第一个表单) ,对吗?

这是非常规的,但您可以更改new的{​​{1}}操作,因此接受POST而不是传统的GET。在WorkoutsController

routes.rb

<强>更新

执行此类操作的干净RESTful方法是为第一个表单创建一个单独的控制器(工作标题 - map.resources :clients do |clients| clients.resources :workouts, :new => { :new => :post } end )和操作(ConfigWorkoutsContollernew),如下所示;

  • create呈现表格(如图所示),即GET
  • 其提交操作是对ConfigWorkoutsContoller#new
  • create操作的POST
  • date预先填充@workout实例并呈现ConfigWorkoutsContoller#create

答案 1 :(得分:0)

我不确定这是否与您的问题直接相关,但在使用嵌套资源时,您需要将两个资源都传递到表单标记,以便生成正确的路由。含义:

<%  form_tag new_client_workout_path(@client, @workout) do %>

我对你正在做的事情的具体细节知之甚少,所以直接找到答案有点困难。什么是@workout_user?你的路线是什么样的?

编辑:

在看到下面的回复之后,执行此操作的“更清洁的方法”是:

<%  form_tag(new_client_workout_path(@workout_user), :method => :get) do %>

注意:guides似乎使用引号“get”,但我认为符号也可以。

答案 2 :(得分:0)

我可以通过添加隐藏的表单字段来使其工作

<%= hidden_field_tag '_method', 'get' %>

以便表单方法发布,但其余方法是get

不确定我是否以正确的方式完成所有这些操作,或者是否有更多可接受的方式来获取新操作的用户输入。通常情况下,您将从新操作获得所有用户输入,但在这种情况下,我将根据用户选择的日期不同地构建表单。