0

URLでフォームを送信したい

/index/fruit

フォームデータを送信する

/index/:identifier 

ここで、:identifier は次の形式の値によって決定されます。

この場合のレール規約は何ですか? コントローラーレベルのリダイレクトや送信 URL の JavaScript 更新を行わずにこれを実現する方法はありますか?

ルート.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

これには実際には「規則」はありませんが、それを行う方法が複数ある場合の 1 つです。

これを行う 1 つの方法は、フォームをコントローラー内の 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 に答える