Rails 3.1.3
Hi. I have defined a new action, create_or_update, namely, it creates if doesn't exist, update if exists.
def create_or_update @script = Script.find_or_create_by_startp_and_video_id(params[:startp], params[:video_id]) reposnd_to do |format| @script.update_attributes({ :id => self.id, :startp => self.startp, :text => self.text }) end end
And in the view,
<%= render :partial => "create_or_update_script", :locals => { :script => Script.find_or_create_by_video_id(:video_id => @video.id)} %>
(hoping that it) renders, _create_or_update_script.html.erb
<%= form_for script, :url=>{:controller=>'scripts', :action=>'create_or_update'}, :remote => true do |f| %> <%= f.hidden_field :video_id %> <%= f.text_field :startp, :readonly => true %> <%= f.text_field :text %> <%= f.submit "create_or_update" %> <% end %>
I specified both the controller and the action. If I try to save a new entry, it gives an error,
Started PUT "/scripts/create_or_update" for 127.0.0.1 at 2012-02-19 19:53:33 +0900 Processing by ScriptsController#update as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"VoFDQN3sbqdUmiYEd8E54IlTI3yJPuNpMf9sc2Gmtho=", "script"=>{"video_id"=>"18", "startp"=>"41", "text"=>"how this is happening"}, "commit"=>"create_or_update", "id"=>"create_or_update"} Script Load (0.1ms) SELECT "scripts".* FROM "scripts" WHERE "scripts"."startp" IS NULL LIMIT 1 Completed 500 Internal Server Error in 122ms NoMethodError (undefined method `startp' for #<ScriptsController:0x00000129eb5120>): app/controllers/scripts_controller.rb:79:in `block in update' app/controllers/scripts_controller.rb:76:in `update'
It is calling "app/controllers/scripts_controller.rb:79:in `block in update'", which is
def update @script = Script.find_by_startp(params[:startp]) respond_to do |format| if @script.update_attributes(params[:script]) format.json { head :ok } else format.html { render action: "edit" } format.json { render json: @script.errors, status: :unprocessable_entity } end end end
Also, in the error, ""id"=>"create_or_update"" which is supposed to be an integer for the id of 'script', if I understand Rails correctly.
My question is: 1. Why is it calling the update action? (I am guessing it's due to routes.rb) 2. How can I pass the proper id for 'Script' ?
Thanks in advance.
soichi