The action could not be found for controller - ruby-on-rails

Having gone through my code I have a separate problem from my original question and rather than writing a new question. I will leave the old part at the bottom of this and post the new problem here. I do this because they are closely related.
New:
Im getting an error message saying
Unknown action
The action 'response' could not be found for CrawlerController
I'll keep it simple but the code for model, controller and routes are below in the previous question.
A basic run down is response is a def within CrawlerController as is add_Request.
The routes are matched as such:
match "/requests/new" => "crawler#add_Request"
match 'requests/:id' => 'crawler#response'
Here is controller code as per user request:
class CrawlerController < ApplicationController
def add_Request
#request = Request.new(params[:request])
respond_to do |format|
if #request.save
format.html { redirect_to(#request, :notice => 'Request was successfully created.') }
format.xml { render :xml => #request, :status => :created, :location => #request }
else
format.html { render :action => "new" }
format.xml { render :xml => #request.errors, :status => :unprocessable_entity }
end
end
end
def response
#request = Request.find(params[:id])
respond_to do |format|
format.html
format.js { render :json => #request }
end
end
def show
#request = Request.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => #request }
format.json{
render :json => #request.to_json
}
end
end
end

please recheck code of controller as I can see it
class CrawlerController < ApplicationController
def add_Request
#request = Request.new(params[:request])
respond_to do |format|
if #request.save
format.html { redirect_to(#request, :notice => 'Request was successfully created.') }
format.xml { render :xml => #request, :status => :created, :location => #request }
else
format.html { render :action => "new" }
format.xml { render :xml => #request.errors, :status => :unprocessable_entity }
end
end
def response
#request = Request.find(params[:id])
respond_to do |format|
format.json {render :#request.to_json}
end
end
so one end is missing an your response action is defined inside add_Request

Related

ruby on rails chaining 3 actions from one button

I have a controller with new, create, and edit actions, amongst others as shown below.
Right now, I have 3 buttons in my form, one to start a new project (new), another button to save it (create) and a 3rd button to edit the project after it is created (edit).
I'd like to create a single button that would combine the execution of all 3 actions in sequence : new, then create, then edit.
Is that possible?
# GET /projects/new
# GET /projects/new.json
def new
#project = Project.new
respond_to do |format|
format.html # new.html.erb
format.json { render :json => #project }
end
end
# GET /projects/1/edit
def edit
#project = Project.find(params[:id])
end
# POST /projects
# POST /projects.json
def create
#project = Project.new(params[:project])
respond_to do |format|
if #project.save
format.html { redirect_to #project, :notice => 'Project was successfully created.' }
format.json { render :json => #project, :status => :created, :location => #project }
else
format.html { render :action => "new" }
format.json { render :json => #project.errors, :status => :unprocessable_entity }
end
end
end
def create
#project = Project.new(params[:project])
respond_to do |format|
if #project.save
format.html { redirect_to edit_project_path(#project), :notice => 'Project was successfully created.' }
format.json { render :json => #project, :status => :created, :location => #project }
else
format.html { render :action => "new" }
format.json { render :json => #project.errors, :status => :unprocessable_entity }
end
end
end

Routing to contents of model failing due to no ID match

I am relatively new to Rails and have recently managed to break the links to the contents of one of my models...
Having previously posted a question here on stackoverflow, I adjusted the to_param function in my model, such that the product name would be appended to the product ID.
The changes I made were:
In products.rb,
def to_param
"#{id}-#{product_name.parameterize}"
end
In routes.rb,
match '/:id' => 'uniquewetsuits#show'
This successfully creates the address I am hoping for /products/ID-product-name, however, I get an error stating there is no product with ID=ID-product-name.
If I navigate to /products/ID, I can successfully view the page as normal.
Can anybody inform me as to how I go about reconnecting things so that I do get a match for the longer ID string?
Thanks for your time
EDIT
The contents of the controller are:
def index
##search = Uniquewetsuit.search(params[:q])
##findwetsuits = #search.result(:distinct => true)
#if #findwetsuits.count > 0
# #uniquewetsuits = #findwetsuits.all
#else
#uniquewetsuits = Uniquewetsuit.all
#end
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => #uniquewetsuits }
end
end
# GET /uniquewetsuits/1
# GET /uniquewetsuits/1.xml
def show
#uniquewetsuit = Uniquewetsuit.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => #uniquewetsuit }
end
end
# GET /uniquewetsuits/new
# GET /uniquewetsuits/new.xml
def new
#uniquewetsuit = Uniquewetsuit.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => #uniquewetsuit }
end
end
# GET /uniquewetsuits/1/edit
def edit
#uniquewetsuit = Uniquewetsuit.find(params[:id])
end
# POST /uniquewetsuits
# POST /uniquewetsuits.xml
def create
#uniquewetsuit = Uniquewetsuit.new(params[:uniquewetsuit])
respond_to do |format|
if #uniquewetsuit.save
format.html { redirect_to(#uniquewetsuit, :notice => 'Uniquewetsuit was successfully created.') }
format.xml { render :xml => #uniquewetsuit, :status => :created, :location => #uniquewetsuit }
else
format.html { render :action => "new" }
format.xml { render :xml => #uniquewetsuit.errors, :status => :unprocessable_entity }
end
end
end
# PUT /uniquewetsuits/1
# PUT /uniquewetsuits/1.xml
def update
#uniquewetsuit = Uniquewetsuit.find(params[:id])
respond_to do |format|
if #uniquewetsuit.update_attributes(params[:uniquewetsuit])
format.html { redirect_to(#uniquewetsuit, :notice => 'Uniquewetsuit was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => #uniquewetsuit.errors, :status => :unprocessable_entity }
end
end
end
# DELETE /uniquewetsuits/1
# DELETE /uniquewetsuits/1.xml
def destroy
#uniquewetsuit = Uniquewetsuit.find(params[:id])
#uniquewetsuit.destroy
respond_to do |format|
format.html { redirect_to(uniquewetsuits_url) }
format.xml { head :ok }
end
end

How to create a new object in Rails with a predefined property

I have a Rails app that has a bunch of pages, each page has many convos. On each page there's a link to create a new convo on that page. This is the code for that link:
<%= link_to 'New Convo', new_convo_path(:page=>#page) %>
However, on the next page, "convo/new" the page property is empty. What am I missing?
EDIT here are my new and create functions for convos
def new
#convo = Convo.new(params[:page])
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => #convo }
end
end
# POST /convos
# POST /convos.xml
def create
#convo = Convo.new(params[:convo])
respond_to do |format|
if #convo.save
format.html { redirect_to(#convo, :notice => 'Convo was successfully created.') }
format.xml { render :xml => #convo, :status => :created, :location => #convo }
else
format.html { render :action => "new" }
format.xml { render :xml => #convo.errors, :status => :unprocessable_entity }
end
end
end
You need to load the page ... try to set a before filter ...
before_filter :find_page
private
def find_page
#page = Page.find(params[:page_id])
end
Then you build using nested resources
def new
#convo = #page.convos.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => #convo }
end
end
def create
#convo = #page.convos.build(params[:convo])
.....
end
My guess is that you are missing a ":page=>"
def new
#convo = Convo.new(:page=>params[:page])
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => #convo }
end
end

swfupload 406 not acceptable error

def create
#asset = Asset.new(params[:asset])
respond_to do |format|
if params[:Filedata]
#asset = Asset.new :swf_uploaded_data => params[:Filedata]
#asset.user = current_user
#asset.save!
format.html { render :text => #asset.image.url(:thumb) }
format.xml { render :nothing => true }
else
if #asset.save
flash[:notice] = 'Created'
format.html { redirect_to(#asset) }
format.xml { render :xml => #asset, :status => :created, :location => #asset }
else
format.html { render :action => "new" }
format.xml { render :xml => #asset.errors, :status => :unprocessable_entity }
end
end
end
end
I am creating an upload status bar with swfupload. At the end of the upload I get a 406 error.
Not necessarily your answer but I had the same problem with Plupload and it happens that the request format is nil.
It might not be the best way but one could do the following:
request.format ||= :xml
in order to provide some default format in the method. Hope it can help others.

Missing templates from new Rails 3 app?

Just tried writing a simple validates_presence_of in my model, and when the errors try to render, it calls this :
Template is missing
Missing template posts/create with {:locale=>[:en, :en], :handlers=>[:builder, :rjs, :erb, :rhtml, :rxml, :haml], :formats=>[:html]} in view paths "/Users/johnsmith/Sites/shwagr/app/views"
Errors don't have seperate views in Rails3 do they? I thought that was Rails magic..
Curious if anyone had this problem, or knew how to make it correctly validate.
My Model:
validates_presence_of :category, :name, :url
My Controller:
def new
#post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => #post }
end
end
def create
#post = Post.new(params[:post])
if #post.valid? && current_user.posts << #post
respond_to do |format|
if #post.save
format.html { redirect_to(#post, :notice => 'Post was successfully created.') }
format.xml { render :xml => #post, :status => :created, :location => #post }
else
format.html { render :action => "new" }
format.xml { render :xml => #post.errors, :status => :unprocessable_entity }
end
end
end
end
Update
Interesting, I 'touch app/views/posts/create.html.haml', and now it removed the error and instead loads that page instead. But why would it? Or more importantly, how can I make it just redirect back to the new_post_path(#post) like it should?
If your
if #post.valid? && current_user.posts << #post
line returns false, no render() or redirect_to() is called. Rails' default behavior then is to render the view with the same name as your method. That would be create.BUILDER.FORMAT.
Try to remove the line. Use this code instead:
#post = current_user.posts.new(params[:post])
respond_to do |format|
if #post.save
...
Or write an else case with
render :action => "new"
Ah got it. This is because it was never valid so it would loop back to itself on 'create', find no template there and error out. The correct way to set up the def create would be this
def create
#post = Post.new(params[:post])
if #post.valid? && current_user.posts << #post
respond_to do |format|
if #post.save
format.html { redirect_to(#post, :notice => 'Post was successfully created.') }
format.xml { render :xml => #post, :status => :created, :location => #post }
else
format.html { redirect_to new_user_post_path(:current) }
format.xml { render :xml => #post.errors, :status => :unprocessable_entity }
end
end
else
render :action => 'new'
end
end
No, they don't have seperate views. So do you have a app/views/posts/create.html.erb file?

Resources