0

我想要在 url 提交的表单

/index/fruit

提交表单数据到

/index/:identifier 

其中 :identifier 由表单的值确定

在这种情况下,rails 约定是什么?有没有办法在没有控制器级别重定向或 javascript 更新提交 URL 的情况下实现这一点?

路线.rb

match 'smasher(/:action(/:id))', :controller => "customcontroller", :as => :smasher, :defaults => { :action => :index, :id => :fruit }

index.html.erb

<%= semantic_form_for :d, :url => smasher_path,  :html => { :method => :get } do |f| %>
  ... form data ... 
  <%= f.input :identifier, :as => :hidden %>
<% end %>

我目前的实现类似于这个答案

4

2 回答 2

1

对此并没有真正的“约定”,而是其中有不止一种方法可以做到的事情之一。

您可以这样做的一种方法仍然是将表单发送到控制器中的一个且只有一个操作,然后在控制器中委托要执行的操作,如下所示:

def smasher
  if params[:identifier] == 'this'
    smash_this!
  else
    smash_that!
  end
end

def smash_this!
  # code goes here
end

def smash_that!
  # code goes here
end
于 2012-12-09T21:16:25.550 回答
0

这是 javascript 版本(尽管从技术上讲,它全部在erb html 模板上),如果您愿意的话。

<%= f.input :identifier, :as => :hidden, :onchange => "$(this).setAction()" %>

<script>
// While you can this script block here within your erb template
// but best practice says you should have it included somehow within `<head></head>` 
$(function() {

    //create a method on the Jquery Object to adjust the action of the form
    $.fn.setAction = function() {
        var form = $(this).parents('form').first();
        var action = form.attr('action')
        form.attr('action', action.substr( 0, action.lastIndexOf('/')+1 ) + $(this).val());
    }
});
</script>

这是纯javascript版本:

$(function() {

    //create a method on the Jquery Object to adjust the action of the form
    $.fn.setAction = function() {
        var form = $(this).parents('form').first();
        var action = form.attr('action')
        form.attr('action', action.substr( 0, action.lastIndexOf('/')+1 ) + $(this).val());
    }

    //we gotta bind the onchange here
    $('input[name="identifier"]').change($.fn.setAction);          

});
于 2012-12-10T06:32:40.030 回答