我有一个嵌套资源的表单(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方法,哪个有效,但是我在查询字符串上有我不想要的所有表单参数。
有没有办法用帖子来完成这个?
当资源没有嵌套并且工作正常时,我做了类似的事情。
答案 0 :(得分:1)
因此,据我了解,您希望将一个表单(如图所示)作为POST发送到控制器,这会导致呈现另一个表单,该表单预先填充了日期定向参数(来自第一个表单) ,对吗?
这是非常规的,但您可以更改new
的{{1}}操作,因此接受POST而不是传统的GET。在WorkoutsController
routes.rb
<强>更新强>
执行此类操作的干净RESTful方法是为第一个表单创建一个单独的控制器(工作标题 - map.resources :clients do |clients|
clients.resources :workouts, :new => { :new => :post }
end
)和操作(ConfigWorkoutsContoller
和new
),如下所示;
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
不确定我是否以正确的方式完成所有这些操作,或者是否有更多可接受的方式来获取新操作的用户输入。通常情况下,您将从新操作获得所有用户输入,但在这种情况下,我将根据用户选择的日期不同地构建表单。