2010-08-09 49 views
0

我有一个嵌套的资源形式(客户端:锻炼的has_many),我想基于一些用户输入预填充(我用这个输入设置了一些其它的默认参数新行动)。Ruby on Rails的 - 预填充新的记录

<% 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. 

我可以更新窗体的方法来获取,它的工作原理,但是然后我在查询字符串,我不想要的所有我的表单参数。

有没有某种方式来完成这个使用职位?

我做过类似的东西时,没有嵌套的资源和它工作得很好。

回答

1

所以,据我所知,想要的形式(如图所示)被发送作为POST到控制器,该控制器使另一种形式被呈现,其是预先填入日期定向参数(从第一形式), 对?

这是非常规的,但你可以只是改变行动WorkoutsController所以接受一个POST而不是传统的GET。第一种形式和行动(newcreate)如下 - 在routes.rb

map.resources :clients do |clients| 
    clients.resources :workouts, :new => { :new => :post } 
end 

UPDATE

干净RESTful的方式做这样的事情是有一个单独的控制器(ConfigWorkoutsContoller暂定名) ;

  • ConfigWorkoutsContoller#new呈现形式(如图所示),其是GET
  • 其提交动作是POST到create动作与date
  • ConfigWorkoutsContoller#create预先填充@workout实例并呈现WorkoutsController#new
+0

是的,这正是我想要做的。在这种情况下,用户正在遵循锻炼计划,因此根据预先填写他/她当天应该执行的练习的日期。出于这个原因,我需要提前知道日期,而只需在日期选择器上进行新的锻炼。处理这种情况是否有更好的模式? – John 2010-08-09 18:13:25

+0

@John使用建议的更清晰的RESTful方法查看我的更新 – bjg 2010-08-09 20:47:12

0

我不知道如果这是直接关系到你的问题,但使用嵌套的资源的时候,你需要在两个资源传递给你的表单标签为它生成正确的路线。意思是:

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

我对所做的具体事情不够了解,所以直接找到答案有点困难。什么是@workout_user?你的路线是什么样的?

编辑:

下方看到您的回复后,“更清洁的方式”来做到这一点是做:

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

注:guides似乎使用带引号的“获取”,但我认为一个符号也适用。

+0

你确定吗?有了new_path我很确定你只需要@client资源(注意,我正在尝试去NEW操作,而不是CREATE操作)。另外,@workout_user在这个实例中是@client,只是使用了一个非常规的变量名。 这条路线是 map.resources:clients,:has_many =>'训练' – John 2010-08-09 16:06:21

+0

新的vs创建的好处,我没有抓到。你对新的道路是正确的,你只需要提供客户,但为什么你的形式指向新的道路?这听起来像你需要添加':method =>:get'到你的表单标签。 – theIV 2010-08-09 20:22:19

0

我能够得到它通过添加一个隐藏的表单字段

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

,这样的形式方法是岗位工作,但其余的方法就是让

不知道如果我做所有这一切都是正确的方式,或者如果有更可接受的方式来获取用户对新动作的输入。通常情况下,您会从新操作中获得所有用户输入,但在这种情况下,我将根据用户选择的日期不同地构建表单。

+0

基于这个答案,我已经更新了我的答案。干杯。 – theIV 2010-08-10 15:50:12