RoR - 新的更新操作

时间:2014-08-28 00:41:05

标签: ruby-on-rails controller action

我有两个型号

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为零。有没有办法将客户端本身从表单发送到操作,还是我必须添加带有值的隐藏字段?

1 个答案:

答案 0 :(得分:1)

问题1,当您致电@client.addresses.build时,它正在为客户建立第三个地址。我的猜测是你在表格上显示所有三个地址。

问题2,您希望发送带有请求的客户端ID,并使用它来查找客户端。

以下内容应解决这两个问题。

尽可能 - 并且几乎总是可行的 - 尝试坚持使用standard Rails controller actions。像add_establismentsupdate_establishments这样的非标准控制器操作通常表明存在更多" Rails"模拟控制器的方法。

在这种情况下,我会质疑为什么ClientsContoller处理机构。如果您添加EstablishmentsController,我的猜测就是事情才会开始起作用。以下是如何做到这一点:

在config / routes.rb中,创建一个具有嵌套企业资源的客户端资源。

resources :clients do
  resources :establishments
end

这将为您提供一些nested routes,它们都将以/ clients /:client_id / establishment开头。

创建EstablishmentsController并向其移动add_establishmentsupdate_establishments。将add_establishments重命名为new并将update_establishments重命名为update。同时将相应的视图移动到/ views / establishmentments /并重命名它们以匹配其新的操作名称。

如果没有令人信服的理由在new操作中找到客户端,您可以构建一个新的机构以传递给视图。无论哪种方式,您的表单都将与此新建立相关联,而不是与现有客户相关联。 (问题1)

update中,您将使用:client_id参数来查找客户端。 (问题2)update需要进行一些按摩,但我需要知道您是否真的一次更新多个机构或只是一个机构来说明它的样子。 (您不会更新@client本身,而是客户的机构。)