Ruby on rails Rails:视图中有一个按钮调用控制器中的一个方法,路由不起作用

Ruby on rails Rails:视图中有一个按钮调用控制器中的一个方法,路由不起作用,ruby-on-rails,ruby,routes,Ruby On Rails,Ruby,Routes,嗨,我正在制作一个使用Zendesk API调用的rails应用程序。我有一个控制器,它使用我定义的两个类 class TicketsController < ApplicationController require 'ticket_fields' require 'ticket_search' def getTickets @search_fields = SearchFields.new(client) @tickets = TicketSearch.

嗨,我正在制作一个使用Zendesk API调用的rails应用程序。我有一个控制器,它使用我定义的两个类

class TicketsController < ApplicationController

  require 'ticket_fields'
  require 'ticket_search'

  def getTickets
    @search_fields = SearchFields.new(client)
    @tickets = TicketSearch.new(client)
  end

  def search_tickets
    @ddcustomvalues = [params[:customer_company_id], params[:study_id], params[:type_id], params[:system_id]]
    @tickets.search_tickets(ddcustomvalues)
  end
end
调用路径的表单标记如下所示

resources :tickets do
    collection do
      put :search_tickets
    end
  end
  <%= form_tag search_tickets_tickets_path, remote: :true do %>
      <table>
          <tr>
            <td align = "left" valign="middle"> <font size = 4> Customer Company </font> </td>
            <td align = "left" valign="middle">
              <%= select_tag "customer_company_id", options_for_select(@search_fields.customer_companies), :prompt => "Select One" %>
            </td>
          </tr>
          ......
          <tr>
             <td> </td>
             <td align = "left" valign="middle">
              <%= submit_tag "Search" %>
             </td>
          </tr>
       </table>
    <% end %>
================================================================================== 更新

我想我通过将表单标签更改为此解决了上一个问题

  <%= form_tag search_tickets_tickets_path(@tickets), method: :put, remote: :true do%>
但是现在我在按下按钮后从终端收到了这个错误

NoMethodError未定义的方法搜索\u票证'nil:NilClass: app/controllers/tickets\u controller.rb:15:insearch\u tickets'

我如何通过路由传递@tickets作为参数,因为搜索tickets现在显然无法访问@tickets,因为它给出了一个nil类错误。

变量

按下按钮时,@text的值将更改为生成的查询字符串

在我看来,您似乎对Rails的本质感到困惑,因为视图已经呈现并不意味着值/变量仍然可以使用

评论中提到,您似乎在很大程度上是基于其他框架/编程模式的经验。描述您的解决方案的最佳方式是Rails必须在每次处理请求时刷新所有变量/值;因此,这意味着,如果您发送一个按钮请求,您必须像第一个按钮请求一样执行该请求

阿贾克斯

底线是,你需要使用一个工具来实现这一点

要做到这一点,您最好创建一个表单,而不仅仅是一个按钮,因为这将使您能够发送任意数量的参数。你应使用:

这将使您能够在控制器中定义以下内容:

#app/controllers/tickets_controller.rb
Class TicketsController < ApplicationController
   def search_tickets
    @ddcustomvalues = [params[:customer_company_id], params[:study_id], params[:type_id], params[:system_id]]
    @tickets.search_tickets(ddcustomvalues)

    respond_to do |format|
       format.js #-> loads /views/tickets/search_tickets.js.erb
       format.html
    end
  end
end

#app/views/tickets/tickets_search.js.erb
//JS here to manipulate your original page 
请求

这里的底线是,如果您想在不刷新的情况下操作视图,与本机应用程序框架不同,本机应用程序框架依赖于持久状态,而Rails则基本上需要从头开始构造请求,即传递方法运行所需的所有参数


在我看来,您有一个asp.NETWebForms或JSF的基础,在这里您可以单击一些东西并自动更新。在rails中是不同的,客户机和服务器之间的分离不会对您隐藏。解决问题的一种方法是在html中添加表单并提交页面,在search_tickets方法中返回getTickets的视图。下面是如何渲染特定视图的链接:这都是很好的信息!谢谢你知道有什么好的消息来源可以让我读到更多关于这个的信息吗?我以前的经验是使用asp.NETWebForms,正如另一位发帖人所猜测的,我对整个web开发相当陌生。谢谢你的帮助。嘿,没问题!最好的办法是结帐或者找一个新来的孩子:嘿,我遇到了另一个问题,我想这是我设置路线的方式的问题,如果有任何问题的话,你可以看看,并提供一些建议,这将是令人惊讶的。我用新问题编辑了我原来的问题。
$("#test").html("<%= escape_javascript(render partial: 'text', locals: { text: @tickets.text } ) %>");  
resources :tickets do
    collection do
      put :search_tickets
    end
  end
  <%= form_tag search_tickets_tickets_path, remote: :true do %>
      <table>
          <tr>
            <td align = "left" valign="middle"> <font size = 4> Customer Company </font> </td>
            <td align = "left" valign="middle">
              <%= select_tag "customer_company_id", options_for_select(@search_fields.customer_companies), :prompt => "Select One" %>
            </td>
          </tr>
          ......
          <tr>
             <td> </td>
             <td align = "left" valign="middle">
              <%= submit_tag "Search" %>
             </td>
          </tr>
       </table>
    <% end %>
  <%= form_tag search_tickets_tickets_path(@tickets), method: :put, remote: :true do%>
#config/routes.rb
resources :tickets do 
   collection do
      get :search_tickets
   end
end

#view
<%= form_tag tickets_search_tickets_path, remote: :true do %>
    ... #-> fields for your params
    <%= submit_tag "Search" %>
<% end %>
#app/controllers/tickets_controller.rb
Class TicketsController < ApplicationController
   def search_tickets
    @ddcustomvalues = [params[:customer_company_id], params[:study_id], params[:type_id], params[:system_id]]
    @tickets.search_tickets(ddcustomvalues)

    respond_to do |format|
       format.js #-> loads /views/tickets/search_tickets.js.erb
       format.html
    end
  end
end

#app/views/tickets/tickets_search.js.erb
//JS here to manipulate your original page