【问题标题】:Append/Update params to an existing form using form_for使用 form_for 将参数附加/更新到现有表单
【发布时间】:2013-04-15 17:00:37
【问题描述】:

对 Rails 相当陌生,这意味着我相信我已经掌握了大部分基础知识,但绝对是艺术系的学生。

我要完成的工作: 使用 form_for 将参数附加到现有表单。

因此,我需要找到现有表单的 id 并使用 JobsController 将新的哈希传递给该表单以附加几列数据。

步骤是从 select_box 中选择作业编号,使用 text_fields/check_boxes 为该作业添加任何更改/注释,然后提交。使用的视图也是部分视图,可在视图/作业中找到。

当前的问题,尽管多次尝试,是:
覆盖默认的'post' 方法——尝试了以下几种组合:method => 'put':action => update, :controller => :jobs强>

class Job < ActiveRecord::Base

attr_accessible :note, :twgid, :padd, :lnkbr, :txtwr, :datewr, :pinmiss, :headch,  :name, :nucopy, :minrend, :majrend, :lnkwr, :gmail, :hotmail, :aol, :outlook, :note, :linkwr

belongs_to :form
end


 JobsController: 

 ( scaffolded ) 


View: (jobs/_form.html.erb)

<%= form_for @job do |f| %>

   <fieldset> 
 <div class="form-horizontal">              
 <div class="control-group">
 <span class="control-label">
 <%= f.label :name, "TWGID" %></span>
 <%= f.select :name, options_from_collection_for_select(Job.all, :name, :name), :prompt =>  'Select' %>  
  </fieldset>
  <fieldset>
 <div class="control-group">
 <span class="control-label">
  <%= f.label :padd, "Add Padding?" %></span>
  <%= f.check_box :padd %>   
  <%= f.hidden_field, :updated, :value => '1' %>
  <% end %>

##Routes##

get 'signup', to: 'users#new', as: 'signup'
get 'login', to: 'sessions#new', as: 'login'
get 'logout', to: 'sessions#destroy', as: 'logout'

resources :sessions
resources :users 
resources :forms 
resources :projects
resources :jobs
root :to => 'forms#index'

【问题讨论】:

  • 最后一条评论:奇怪的是,我的模型是嵌套的,所以通常我会使用 f.fields_for :jobs,但这不会产生我认为我需要的 params 哈希,我从: fields_for :job,即 "job"=>{"updated"=>"1"}
  • 如果你在关联上使用 fields_for 你应该得到一个看起来像这样的哈希 "jobs_attributes"=&gt;{[0]=&gt;{"updated"=&gt;"1"}} 只要你有 accepts_nested_attributes_for,Rails 就会知道如何处理它,我看到你这样做
  • 是的,问题是我使用“更新”操作的方式——通常form_for @change 会自动选择适当的 http 操作,但是我正在尝试将属性附加到现有的使用'put' 形成表单,尝试使用form_forfields_for 的各种组合传递:method =&gt; "put"——无论哪种方式,我都会得到创建新记录的默认“发布”操作或错误——所以,此时,我已将“更改”属性迁移到“作业”并创建了一个作业控制器——我正在尝试:使用 form_for 查找现有记录并附加属性

标签: ruby-on-rails-3 twitter-bootstrap boolean form-for


【解决方案1】:

我不能 100% 确定你想做什么,但让我来看看吧。

嗯,我看到的第一件事是,在第一行的 update_job 中,您尝试抓取一个 Change 对象并将其放入 @change。问题是您使用的 @change.id 显然尚未设置。如果您通过参数获取 id,您将要使用:

@change = Change.find(params[:id])

其次,您正在尝试更新 Job 的属性但有一个 Change 对象。这行不通。

我认为您总体上尝试做的是构建一个更新更改并且还将更新其关联(在本例中为作业)的表单。有关如何执行此操作的快速链接在这里:

Form Helpers

这是我建议的代码:

<%= form_for @change do |f| %>
  <%= f.fields_for :job do |j| %>
    Updated  : <%= j.check_box :updated %>
  <% end %>
<% end %>

这会将更新的选项放在params[:change][:jobs_attributes] 中,当您将 params[:change] 发送到您的更新中时,@change.update_attributes(params[:change]) 它也会更新您的工作。

【讨论】:

  • 我无法编辑您的评论,但请您将该代码放入代码块中好吗?我会编辑我的评论:)....继续我需要你的路线文件(将它作为对你的主要问题的编辑发布),也许是你观点的更详细的版本。此外,获取当前提交的参数列表也不会有什么坏处
  • 通过代码块,我的意思是使用数字 1 左侧的刻度,就像这样 Some Code(伙计,在这个上会有很多 cmets 编辑:P)
  • def update_job @change=Change.find(params[:id]) @change.update_attributes(params[:change]) 我得到 "ActiveRecord::RecordNotFound at /changes Couldn't find Change without an ID." 另外,我现在正在尝试使用传递参数一个隐藏字段,即&lt;%= fields_for :job do |ff| %&gt; &lt;%= ff.hidden_field, :updated, :value =&gt; '1' %&gt; 感谢您的帮助!
  • 显着修改了帖子以简化问题并澄清——仍然想知道如何使用先前的设置完成这项任务——我的直觉是解决方案可以在任何一种情况下使用。再次感谢比尔!
猜你喜欢
  • 2017-08-03
  • 2020-07-28
  • 1970-01-01
  • 2021-11-20
  • 2016-10-30
  • 2021-03-02
相关资源
最近更新 更多