Hi
I have in routes.rb like
map.resources :users
Now I am trying to edit a user. What the url shows now is
http://localhost:3000/users/1/edit
But my problem is , when I click on update button and if
validations fail I am re rendering the edit page. And it happens
properly. But the url becomes
http://localhost:3000/users/1
I can't figure it out . Please give a solution. Why this
happens? So if a user goes to url and press enter it will show
Unknown action
No action responded to show. Actions: create, edit, new, and update
My controller code for update is
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
flash[:notice] = ‘User was successfully updated.’
format.html { redirect_to home_url }
format.xml { head :ok }
else
flash.now[:error] = @user.errors.full_messages.join(“
”)
format.html { render :action => “edit” }
format.xml { render :xml => @user.errors, :status =>
:unprocessable_entity }
end
end
end
Thanks in advance
Tom
Your error case rendered the edit template… pretty standard.
The path was called on a POST (the update). There is no corresponding
GET version of that path. So when you try to go there in the browser
you get an error.
Hi
I get error when I enter http://localhost:3000/users/1 from url
But if it is http://localhost:3000/users/1/edit No problem.
So my question is why in the else case it shows in the url
http://localhost:3000/users/1
instead of
http://localhost:3000/users/1/edit
Tom
When you are click on submit to update the data, /users/1 url is called
…
Now if your data is valid and saved properly then it will redirect to
another page…
If your data is not valid or not saved properly then it will render to
edit page…
When you render to any page , it will only call view page and url
remains same,
benefit of render the page is that object contain the current data as
well as the errors (if any which are use to show on page).
Thanks
Brijesh S.
Hi Tom,
It is happening so because, when u clicked update, the browser had
sent post request to the new url which is http://localhost:3000/users/1
which is nothing but update action in ur controller. In ur update
action you are rendering the edit action if the validation failed.
Which means that url on browser doesn’t change but the page being
viewed is still edit page. So when user clicks on the url and press
enter, it sends get request (not post request) to
http://localhost:3000/users/1,
which actually invokes show action in your controller.
The browser behavior is actually normal and correct. If the user
clicks on the url and press enter, it should be assume that user wants
to see the data not edit.
So you actually need to define show action or redirect the user back
to edit page when validation fails (but redirecting will not carry
your validation error messages, so you may have to put some additional
efforts to carry those validation error messages).