在form_tag中加载数据而不在rails 4中刷新页面

时间:2014-05-04 08:25:19

标签: ruby-on-rails activerecord

在rails项目中,我有2个控制器:任务和产品。我想在views/tasks/_form.html.erb中的form_tag中获取产品名称,并从数据库中查找产品数据,并通过javascript向用户显示产品的详细信息,而无需重新加载页面。我有以下代码:

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

视图/任务/ _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>

视图/任务/ show_product.js.erb

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

视图/任务/ _show_product.html.erb

<h1>Test</h1>

的routes.rb

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

但是当我点击submit_tag时,产品名称不会从form_tag发送,也不会在页面中发生任何更改。

单击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)

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

这是您的错误:

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

问题基本上是您尝试加载show操作。典型的原因是,您已在<{1}}文件中声明resources :tasks 后声明路径

试试这个:

routes.rb

这将为您提供collection route,然后您可以使用相应的路径助手调用它。这应该适用于您当前的错误是由与#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 %> 操作

的冲突引起的