相同的形式部分,params存在于创建,但在更新时不存在

时间:2015-09-18 22:37:31

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个表单部分,我重复用于创建和更新操作。在点击创建动作时,我得到了预期的参数哈希,但在更新时不会发生同样的情况。这是我的部分形式。

<%= form_for :track, url: url, method: method do |f| %>
  ...
<% end %>

然后我从一个视图中调用:

<%= render partial: 'form', locals: { url: tracks_path, method: :post } %>

相应的路线:

post '/:user/:playlist/tracks' => 'tracks#create', as: :tracks

控制器动作:

def create
  render plain: params[:track].inspect
end

在提交时,我会收到该表单的所有字段,作为params[:track]的嵌套哈希值。奇怪的是,我没有得到我对更新行动的期望:

# view
<%= render partial: 'form', locals: { url: update_track_path, method: :patch } %>

# route
patch '/:user/:playlist/:track' => 'tracks#update', as: :update_track

# controller 
def update
  render plain: params[:track].inspect
end

我希望在这种情况下params[:track]也是一个嵌套的哈希,但它的内容却是一个字符串。此字符串恰好是:track/:user/:playlist/:track的值。

我很困惑。如何取回嵌套哈希?

1 个答案:

答案 0 :(得分:1)

我认为存在命名冲突。 params[:track]的定义有两种方式:

  • 路线/:user/:playlist/:trackparams[:track]定义为网址的
  • 您的表单将params[:track]定义为值的哈希值

要解决此问题,请更改网址中的参数名称。例如,将网址格式更改为/:user/:playlist/:track_name,然后将网址参数作为params[:track_name]进行访问。

这样,URL参数和表格参数之间不会发生冲突!