ruby on rails 3 - Controller can not detect ajax requests -
i using simple_form gem , generating form specifying remote:true option this:
<%= simple_form_for @webinar, validate: true, remote:true |f| %> so, output html form following fragment:
<form accept-charset="utf-8" action="/webinars" class="simple_form new_webinar" data-remote="true" data-validate="true" enctype="multipart/form-data" id="new_webinar" method="post" novalidate="novalidate"> ... </form> as checked, using standard form_for helper adding data-remote='true' form when remote:true options used. , can see generated html, when using simple_form gem there such attribute, too.
so, in controller have:
def create @webinar = webinar.new(params[:webinar]) respond_to |format| if @webinar.save format.html { redirect_to @webinar, notice: 'webinar created.' } format.js format.json { render json: @webinar, status: :created, location: @webinar } else format.html { render action: "new" } format.json { render json: @webinar.errors, status: :unprocessable_entity } end end end but, format.html used. doing wrong?
edit:
i have used logger.debug request.format check actual format ask , in log file was:
text/html
so, issue must in simple_form generated form - can wrong there when have "data-remote=true"?
you're confusing format.json|format.html remote: true. both different. presence of remote: true not imply format.json.
format.json does not indicate url invoked via javascript. means client expects json output. i.e. not indicate input came from, indicates output required.
the general use of remote:true is, instead of reloading page, submit form ajax request , show response in jquery popup or something. if want display response jquery popup - need html output, not json output right?
some people use remote: true load html content in popup. use case remote: true you're expecting json formatted data. rails cannot make these decisions you. default sends request /webinars , expects handle html response. if want json response - customize url ajax request posted:
simple_form_for @webinar, url: webinar_path(format: :json), ..... if above, webinar controller called json format.
overall:
remote:truecan used bothformat.html,format.json- the majority use case in rails application handle
remote: truecontroller request usual, render partial html template (i.e. response content alone without overall page layout/navigation/etc) , send html displayed in popup - most people blanket-handle remote callbacks , display jquery popup. don't need write individual code each remote forms
- so default, rails calls
format.htmlremote requests - if want
format.json, , if want handle json manually on client, change url accordingly. not majority use case - making ajax request does not mean content-type json. html request made using javascript. e.g. in jquery
$.ajaxmethod, check these 2 options:accept,datatype. if want sendaccepts: application/jsonheader, have manually specify when making ajax request (or need end url.jsonif rails app). - so if make normal ajax request
/webinars,$.ajax('/webinars', ...)- won't goformat.json! still goformat.html. if want json format, must$.ajax('/webinars', { accepts: 'application/json' }), or must$.ajax('/webinars.json')
edit: minor clarification
Comments
Post a Comment