simple redirect_to shows in log but doesn't redirect

This is the offending code

def create     @story = Story.find(params[:story_id])     @story.comments.create params[:comment]     redirect_to story_path(@story) end

When the above is called the log shows

Processing CommentsController#create (for 127.0.0.1 at 2010-07-31 10:04:38) [POST]   Parameters: {"comment"=>{"body"=>"cat"}, "commit"=>"Comment", "authenticity_token"=>"OK3kszAxcRhisEn/YGaG1sWsoX/C4MOxmj4qcUkX/Fs=", "story_id"=>"5"}   e[4;35;1mUser Load (0.5ms)e[0m e[0mSELECT * FROM "users" WHERE ("users"."id" = 2) LIMIT 1e[0m   e[4;36;1mStory Load (0.5ms)e[0m e[0;1mSELECT * FROM "stories" WHERE ("stories"."id" = '5') e[0m   e[4;35;1mComment Create (0.3ms)e[0m e[0mINSERT INTO "comments" ("created_at", "body", "updated_at", "story_id") VALUES('2010-07-31 10:04:39', 'cat', '2010-07-31 10:04:39', 5)e[0m Redirected to http://localhost:3000/stories/5 Completed in 209ms (DB: 1) | 302 Found [http://localhost/stories/5/comments\]

But the page doesn't refresh!!!!!!!!!!!!!!!!

I've read every entry in the forum on the forum and googled this for two days , it's driving me mad. WHY DOESN'T IT WORK

302 Found [http://localhost/stories/5/comments\]

What does this bit at the bottom refer to?

> 302 Found [http://localhost/stories/5/comments\]

What does this bit at the bottom refer to?

That's saying that the response was a 302 and that the url that rails has just finished processing is http://localhost/stories/5/comments

Is there anything unusual in the view that triggers this?

Fred

Is there anything unusual in the view that triggers this?

Fred

This is the view:

<div id="sidebar"> <%= render :partial => 'sidebar' %> </div>

<h1><%= @story.user.login %>'s story </h1>

<br> <%= render :partial => 'friend' %>

<h4>Content</h4> <div id="story"><%= @story.body %></div> <div id='aremark'> <%= render :partial => 'comment' %> </div>

    <h5><label for="login">Make a comment:</label></h5>   <% remote_form_for :comment, :url=>story_comments_path(@story), :html => { :id => 'comment' } do |form| %>        <div id="body"><%= form.text_field :body %></div>        <p><%= submit_tag 'Comment' %></p>

  <% end %>

Neil Bye wrote:

Is there anything unusual in the view that triggers this?

Fred

This is the problem line from the view:

  <% remote_form_for :comment, :url=>story_comments_path(@story), :html => { :id => 'comment' } do |form| %>        <div id="body"><%= form.text_field :body %></div>        <p><%= submit_tag 'Comment' %></p>

However if I leave the remote_ in and change the create function to

def create     @story = Story.find(params[:story_id])     @story.comments.create params[:comment]     respond_to do |format|     format.js     end   end

It responds with

Missing template comments/create.erb in view path app/views

Why wont it find create.rjs?

Neil Bye wrote:

>> Is there anything unusual in the view that triggers this?

>> Fred

> This is the problem line from the view: > <% remote_form_for :comment, :url=>story_comments_path(@story), :html > => { :id => 'comment' } do |form| %>

That's why your redirect doesn't work - the redirect just redirects the request made by the JavaScript (rjs has a page.redirect_to thing that will produce the JavaScript required to point the browser window at a new location. If you are going to do a full page refresh though, what's the point of using Ajax?)

Fred

That's why your redirect doesn't work - the redirect just redirects the request made by the JavaScript (rjs has a page.redirect_to thing that will produce the JavaScript required to point the browser window at a new location. If you are going to do a full page refresh though, what's the point of using Ajax?)

Fred

I didn't really want the whole page refresh I was only using it coz the rjs wasn't working. I want the .rjs coz I want comments to go straight up with no refresh.

Are you saying I should make a line

page.redirect_to story_path(@story), :controller => 'stories'

in the .rjs?

If you want a redirect from rjs that is how you do it (the :controller bit isn't needed). That will do a full page refresh do.

Fred

If you want a redirect from rjs that is how you do it (the :controller bit isn't needed). That will do a full page refresh do.

Fred

The trouble is that it's not even getting to the .rjs. That has been my problem all along. When I click the 'cmment button I get

Comment Create (0.4ms) INSERT INTO "comments" ("created_at", "body", "updated_at", "story_id") VALUES('2010-08-02 09:47:22', 'dog', '2010-08-02 09:47:22', 1)

ActionView::MissingTemplate (Missing template comments/create.erb in view path app/views):   app/controllers/comments_controller.rb:12:in `create'

This is comments/controller create

def create     @story = Story.find(params[:story_id])     @story.comments.create params[:comment]     respond_to do |format|       format.js     end   end

If all you've got is a .rjs file you don't need the respond_to block at alll

Fred

�The trouble is that it's not even getting to the .rjs. That has been my problem all along. When I click the 'cmment button I get

If all you've got is a .rjs file you don't need the respond_to block at alll

Fred

I do need the .rjs to do the page.html_replace I,ve benn tring to do all along. I just can't get to create.rjs Here it is

page.replace_html 'aremark', partial => 'comment' page.redirect_to story_path(@story), :controller => 'stories' page.visual_effect :highlight, 'list', :duration => 3

Its in app/views/story that's right isn't it?

I do need the .rjs to do the page.html_replace I,ve benn tring to do all along. I just can't get to create.rjs Here it is

page.replace_html 'aremark', partial => 'comment' page.redirect_to story_path(@story), :controller => 'stories' page.visual_effect :highlight, 'list', :duration => 3

Its in app/views/story that's right isn't it?

Your log files say this is happening in your comments controller so it should be in app/views/comments.

Fred

Your log files say this is happening in your comments controller so it should be in app/views/comments.

Fred

There is a copy in app/views/comments. I've attached show.html.erb in case there is something I missed. The link_to, which is there as a test, works.

This is how the comment function looks now.

def create     @story = Story.find(params[:story_id])     @story.comments.create params[:comment]     respond_to do |format|       format.rjs     end   end

Is there anything else I could send that might solve this?

Attachments: http://www.ruby-forum.com/attachment/4898/show.html.erb

> Your log files say this is happening in your comments controller so it > should be in app/views/comments.

> Fred

There is a copy in app/views/comments. I've attached show.html.erb in case there is something I missed. The link_to, which is there as a test, works.

This is how the comment function looks now.

def create @story = Story.find(params[:story_id]) @story.comments.create params[:comment] respond_to do |format| format.rjs end end

Is there anything else I could send that might solve this?

The respond_to is unnecessary if you're only ever going to be using the rjs template for this action

Fred

Is there anything else I could send that might solve this?

The respond_to is unnecessary if you're only ever going to be using the rjs template for this action

Fred

I'm sorry this is being so difficult. The create function now looks like this:

  def create     @story = Story.find(params[:story_id])     @story.comments.create params[:comment]       format.js   end

The log now says

ArgumentError (too few arguments):   app/controllers/comments_controller.rb:12:in `format'   app/controllers/comments_controller.rb:12:in `create'

So I think we need

  def create     @story = Story.find(params[:story_id])     @story.comments.create params[:comment]     respond_to do |format|       format.js     end   end

Which takes us back to the root of the problem

ActionView::MissingTemplate (Missing template comments/create.erb in view path app/views):   app/controllers/comments_controller.rb:12:in `create'

In peace Neil

Check your rjs code. Run debugger and insert <%debugger%> at the very top of the rjs file, if catches the debugger then you have an rjs code error. Install firebug and view the returned javascript. Since the rjs is rendered after the insert your insert would reflect in the log but bad rjs code would not run, sometimes there an error if you have a ruby-code problem, sometimes no error if its only java-script related.

You can also check your request format from within the controller with ... request.format :wink:

i was saying you need neither -

def create @story = Story.find(params[:story_id]) @story.comments.create params[:comment]   end

Joshua Mckinney wrote:

Check your rjs code. Run debugger and insert <%debugger%> at the very top of the rjs file, if catches the debugger then you have an rjs code error. Install firebug and view the returned javascript. Since the rjs is rendered after the insert your insert would reflect in the log but bad rjs code would not run, sometimes there an error if you have a ruby-code problem, sometimes no error if its only java-script related.

You can also check your request format from within the controller with ... request.format :wink:

If I run the request with firebug it breaks at line 13 of prototpye,js

Browser: {     IE: !!(window.attachEvent &&       navigator.userAgent.indexOf('Opera') === -1),     Opera: navigator.userAgent.indexOf('Opera') > -1,     WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,     Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&       navigator.userAgent.indexOf('KHTML') === -1,     MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)   },

Is my problem maybe that Ubuntu or Linux or Firefox are not there?

I still don't understand why it is looking for create.erb surely the format.js in the create function is supposed to override that.

Even more confused

In peace Neil

Frederick Cheung wrote:

Check your rjs code. Run debugger and insert <%debugger%> at the very top of the rjs file, if catches the debugger then you have an rjs code error. Install firebug and view the returned javascript. Since the rjs is rendered after the insert your insert would reflect in the log but bad rjs code would not run, sometimes there an error if you have a ruby-code problem, sometimes no error if its only java-script related.

You can also check your request format from within the controller with ... request.format :wink: