【问题标题】:Issue with Ransack Rails processes via the wrong action错误操作导致 Ransack Rails 进程出现问题
【发布时间】:2023-06-02 22:51:01
【问题描述】:

我在我的 Rails 5.2 应用程序中使用 Ransack 来使用过滤器进行搜索。它在控制器中使用 Index 操作并正确呈现结果,直到我尝试在同一控制器中的另一个操作中创建第二个过滤器。一旦我在新操作的视图中使用过滤器,它就会显示过滤器仍在使用原始操作进行处理。

我将在下面添加原始和新的操作/视图。似乎无法告诉 ransack 专门处理特定操作。

原始工作代码

事件#索引

def index

    @category_list = Category.all.order("name ASC")

    # Get non expired events
    @events = Event.where("expiry > ?", Time.now)
    @events = @events.all
    @events = @events.paginate(:page => params[:page], :per_page => 12).order("created_at DESC")

    #ransack
    @search = @events.ransack(params[:q])
    @data = @search.result(:distinct => true)
    @events = @data.to_a

end

索引视图(只是相关的位)

    <%= search_form_for([:admin, @search], remote: true ) do |f| %>

     <div class="wrapper" id="event_listing">
     <%= render partial: "/admin/events/events-list", locals: {events: @events} %>
   </div>

所以索引页面呈现一个带有@events结果的部分

index.js.erb

$('#event_listing').html('<%= j render partial: "/admin/events/events-list", locals: {events: @events} %>');
$('.collapsible').collapsible();

一切正常。

现在,如果我用代码添加一个名为 expired_events 的新操作

def expired_events

    @category_list = Category.all.order("name ASC")

    # Get expired events
    @events = Event.where("expiry < ?", Time.now)
    @events = @events.all
    @events = @events.paginate(:page => params[:page], :per_page => 12).order("created_at DESC")

    #ransack
    @expired_search = @events.ransack(params[:q])
    @data = @expired_search.result(:distinct => true)
    @events = @data.to_a

end

我还为我的路线开辟了一条新路线

routes.rb

resources :events do
    collection do
        get 'destroy_multiple_images'
        get 'destroy_single_image', action: "destroy_single_image"
        get 'expired_events'
    end
end

expired_events.html.erb

<%= search_form_for([:admin, @expired_search], remote: true ) do |f| %>

<div class="wrapper" id="event_listing">
   <%= render partial: "/admin/events/events-list", locals: {events: @events} %>
</div>

这里的重点是告诉搜索表单有关 admin 命名空间中的不同变量。我认为渲染将在 js 中寻找相同的名称,如下所示。

expired_events.js.erb

$('#event_listing').html('<%= j render partial: "/admin/events/events-list", locals: {events: @events} %>');
$('.collapsible').collapsible();

现在,当我从 expired_events 视图页面点击过滤器按钮时,Rails 在服务器中向我显示它仍在处理 index.js.erb 文件。有谁知道如何专门告诉它呈现正确的 js 搜索表单?

我几乎可以肯定渲染的局部变量中的变量不会产生影响,就好像我可以让 Ransack 从正确的搜索表单运行一样,结果应该会根据操作而改变。

我在 expired_events 页面时的屏幕截图

然后,当我使用过滤器时,我得到的结果显示过滤器仍在使用 index.js 文件。

任何帮助将不胜感激。谢谢大家。

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-5 ransack


    【解决方案1】:

    知道了。谢谢。

    如果有人有更清洁或更正确的做法,我会全力以赴,谢谢。特别能够告诉表单使用如下所示的操作。

    <%= search_form_for([:admin, @expired_search], url: url_for(controller: 'events', action: 'expired_events'), remote: true ) do |f| %>
    

    【讨论】: