我有一个表单部分,我重复用于创建和更新操作。在点击创建动作时,我得到了预期的参数哈希,但在更新时不会发生同样的情况。这是我的部分形式。
<%= 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
的值。
我很困惑。如何取回嵌套哈希?
答案 0 :(得分:1)
我认为存在命名冲突。 params[:track]
的定义有两种方式:
/:user/:playlist/:track
将params[:track]
定义为网址的params[:track]
定义为值的哈希值要解决此问题,请更改网址中的参数名称。例如,将网址格式更改为/:user/:playlist/:track_name
,然后将网址参数作为params[:track_name]
进行访问。
这样,URL参数和表格参数之间不会发生冲突!