Ruby on Rails : how to implement Cancel button in form_tag

后端 未结 4 1276
情书的邮戳
情书的邮戳 2021-02-07 15:28

I have a basic form using the form_tag helper working fine, but I want to add a cancel button, what is the syntax for doing this? I want the cancel button to appear as a button

相关标签:
4条回答
  • 2021-02-07 15:38

    If you mean a reset button, paste the following inside your form:

    <%= button_tag "Reset", type: :reset %>
    

    Tested it, it works fine and resets all fields in the form.

    0 讨论(0)
  • 2021-02-07 15:55

    Instead of a submit tag, I would suggest a <button> tag, because the parameter :commit might be localised, thus making it a pain to evaluate in the controller.

    A button_tag can have a name/value like any other field, so you can basically create a flag with it.

    The following code is what I would use:

    in the view:

    <%= button_tag t('buttons.cancel'), type: "submit", name: "cancel", value: true %>
    

    in the controller:

    before_filter :redirect_cancel, only: [:create, :update]
    
    private
    
    def redirect_cancel
      redirect_to my_page_path if params[:cancel]
    end
    

    Much cleaner imho, because you rely on a flag instead of a (potentially) localised display value.

    0 讨论(0)
  • 2021-02-07 15:56

    button_to seems a simple way to achieve the same, but it has to be put outside of the form itself, but that can easily be fixed with css.

    Also, to solve this in a more generic way (also working for editing nested resources on a resource that has not been persisted yet), you can create a separate form for the cancel that contains all the original values as hidden fields.

    0 讨论(0)
  • 2021-02-07 16:01

    If you want to clear/reset the form fields, do what dchacke suggests.

    However, I'd generally expect a Cancel button to not clear the form, but to take me away from the form, meaning I don't plan on submitting it.

    If you want the latter, I'd just make a link (or button) to the page you want to go to upon cancelling, such as :

    =link_to 'Cancel', my_page_path
    

    Or if you want a button:

    = button_tag "Cancel", :type => 'button'
    

    Then add this to your controller:

    before_filter :check_for_cancel, :only => [:create, :update]
    
    def check_for_cancel
      if params[:commit] == "Cancel"
        redirect_to my_page_path
      end
    end
    
    0 讨论(0)
提交回复
热议问题