Question

In a rails project, I have 2 controller:tasks and product. I want get a product name in views/tasks/_form.html.erb in a form_tag and find the product's data from database and show the detail of product to user by javascript without reloading the page. I have below code:

tasks_controller:

  class TasksController < ApplicationController
  before_action :set_task, only: [:show, :edit, :update, :destroy]

  before_filter :authenticate_user!
  layout "task"

  # GET /tasks
  # GET /tasks.json

  def show_product
    @product = Product.all
  end

  def index
    @tasks = Task.all
  end

  # GET /tasks/1
  # GET /tasks/1.json
  def show
  end

  # GET /tasks/new
  def new
    @list_of_category = Category.all
    @list_of_product = Product.all
    @reporter = Reporter.find(params[:reporter_id])
    @task = Task.new
  end

  # GET /tasks/1/edit
  def edit
    @list_of_category = Category.all
    @list_of_product = Product.all
  end

  # POST /tasks
  # POST /tasks.json
  def create
    @task = Task.new(task_params)
    @task.responsibility = current_user.responsibility
    @task.reporter = @reporter
    @task.date_time = Time.now
    @task.trace_code = (Time.now.to_f * 1000).to_i

    respond_to do |format|
      if @task.save
        format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render action: 'show', status: :created, location: @task }
      else
        format.html { render action: 'new' }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /tasks/1
  # PATCH/PUT /tasks/1.json
  def update
    respond_to do |format|
      if @task.update(task_params)
        format.html { redirect_to @task, notice: 'Task was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /tasks/1
  # DELETE /tasks/1.json
  def destroy
    @task.destroy
    respond_to do |format|
      format.html { redirect_to tasks_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_task
      @task = Task.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def task_params
      params.require(:task).permit(:responsibility_id, :reporter_id, :date_time, :trace_code, :status, :describe, :category_id, :product_id)
    end
end

views/tasks/_form.html.erb

<%= form_tag 'tasks/show_product', :remote => true, :method => :get  do %>
    <%= text_field_tag :q %><br/>
    <%= submit_tag %>
<% end %>
<div id="response">

</div>

views/tasks/show_product.js.erb

$("#response").html("<%= escape_javascript(render 'tasks/show_product') %>")

views/tasks/_show_product.html.erb

<h1>Test</h1>

routes.rb

match "/tasks/show_product" => "tasks#show_product" , :via => :get

but when I click on submit_tag, product name don't send from form_tag and don't occur any change in page.

log of system when I click on submit_tag:

    Started GET "/tasks/show_product?utf8=%E2%9C%93&q=Product+1&commit=Save+changes" for 127.0.0.1 at 2014-05-04 13:35:36 +0430
Processing by TasksController#show as JS
  Parameters: {"utf8"=>"✓", "q"=>"Product 1", "commit"=>"Save changes", "id"=>"show_product"}
  Task Load (0.0ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = ? LIMIT 1  [["id", "show_product"]]
Completed 404 Not Found in 2ms

ActiveRecord::RecordNotFound (Couldn't find Task with id=show_product):
  app/controllers/tasks_controller.rb:85:in `set_task'


  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (29.0ms)

Where is the problem?

Was it helpful?

Solution

Here's your error:

ActiveRecord::RecordNotFound (Couldn't find Task with id=show_product)

The problem is basically that you're trying to load the show action. Typical cause is tha you've declared the path after you've declared resources :tasks in your routes.rb file

Try this:

#config/routes.rb
resources :tasks do
    collection do
        get :show_products
    end
end

#app/views/tasks/_form.html.erb
<%= form_tag tasks_show_products_path, :remote => true, :method => :get  do %>

This will give you a collection route, which you can then call using the corresponding path helper. This should work as your current error is caused by a conflict with the show action

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top