我有两个型号
Client.rb has_many :addresses accepts_nested_atributes_for :addresses Address.rb has_many :addresses
我在update_establishments
上创建了一个新动作ClientsController
,以便向客户添加新的机构。
ClientsController.rb #the corresponding view of this action will render the locations_form def add_establishments @client = Client.find(params[:id]) @client.addresses.build end def update_establishments create_zip respond_to do |format| if @client.update(client_params) set_zip format.html { redirect_to @client, notice:'Establishment added.'} format.json {head :no_content} else format.html { render action: 'edit'} format.json { render json: @client.error, status: :unprocessable_entity } end end end locations_form %= form_for @client, :url=>{:action=>'update_establishments'}, html:{ :method =>"patch"} do |form| %>
我有两个问题:
1 - 呈现表单时,表单为地址显示两个单独的字段,一个包含现有地址的值,另一个包含新的。如何才能不显示现有地址?
2 - 它在update_establishments
操作上出现明显错误,因为@client
为零。有没有办法将客户端本身从表单发送到操作,还是我必须添加带有值的隐藏字段?
答案 0 :(得分:1)
问题1,当您致电@client.addresses.build
时,它正在为客户建立第三个地址。我的猜测是你在表格上显示所有三个地址。
问题2,您希望发送带有请求的客户端ID,并使用它来查找客户端。
以下内容应解决这两个问题。
尽可能 - 并且几乎总是可行的 - 尝试坚持使用standard Rails controller actions。像add_establisments
或update_establishments
这样的非标准控制器操作通常表明存在更多" Rails"模拟控制器的方法。
在这种情况下,我会质疑为什么ClientsContoller
处理机构。如果您添加EstablishmentsController
,我的猜测就是事情才会开始起作用。以下是如何做到这一点:
在config / routes.rb中,创建一个具有嵌套企业资源的客户端资源。
resources :clients do
resources :establishments
end
这将为您提供一些nested routes,它们都将以/ clients /:client_id / establishment开头。
创建EstablishmentsController
并向其移动add_establishments
和update_establishments
。将add_establishments
重命名为new
并将update_establishments
重命名为update
。同时将相应的视图移动到/ views / establishmentments /并重命名它们以匹配其新的操作名称。
如果没有令人信服的理由在new
操作中找到客户端,您可以构建一个新的机构以传递给视图。无论哪种方式,您的表单都将与此新建立相关联,而不是与现有客户相关联。 (问题1)
在update
中,您将使用:client_id
参数来查找客户端。 (问题2)update
需要进行一些按摩,但我需要知道您是否真的一次更新多个机构或只是一个机构来说明它的样子。 (您不会更新@client
本身,而是客户的机构。)