通过属性搜索时重定向到模型对象的“显示”视图(非ID)

时间:2018-09-11 21:35:44

标签: ruby-on-rails controller routing turbolinks

我有一个表单,用户可以通过该法案的某些属性(例如“国会编号”,“法案类型”和“法案编号”)来查找特定法案,如114-HR.-67所示。我想“显示”适当的账单,但是要做到这一点,我已经在一个单独的操作中获得了适当的账单模型,我将其称为“ find_by_attributes”。在此操作中,我执行以下操作:

@bill = Bill.find_by( params ).first

可以正确获取相应帐单的ID。

现在,我只想重定向到此帐单的“显示”方法,如url中一样

".../bills/[@bill.id]"

截至目前,在我的“ find_by_attributes”操作结束时,我要做的事情

redirect_to bills_path(@bill)

可以正确地使用@bill加载show.html.erb,但不会更改url(该URL仍显示“ find_by_attributes”操作,后跟一个长查询字符串,而不是干净的“ / bills / [ :bill_id]”。

如何重组代码以实现所需的整洁重定向?

下面的完整代码:

表格

<%= form_tag("bills/find_or_create", :method => :get ) do |f| %>
  <%# render 'shared/error_messages', object: f.object %>
  <%= fields_for :bill do |ff| %>
    <%= ff.label :congress, 'Congress (i.e. 114)' %>
    <%= ff.number_field :congress, class: 'form-control' %>

    <%= ff.select :bill_type, options_for_select(
        [['House of Representatives', 'hr'],
         ['Senate', 's'],
         ['House Joint Resolution', 'hjres'],
         ['Senate Joint Resolution', 'sjres'],
         ['House Concurrent Resolution', 'hconres'],
         ['Senate Concurrent Resolution', 'sconres'],
         ['House Resolution', 'hres'],
         ['Senate Resolution', 'sres']]
        )
    %>

    <%= ff.label :bill_number, 'Bill number (i.e. 67)' %>
    <%= ff.number_field :bill_number, class: 'form-control' %>
  <% end %>
  <%= submit_tag "Submit", class: "btn btn-primary" %>
<% end %>

管制员行动

  def find_by_attributes
    @bill = Bill.where(bill_params).first_or_create(bill_attributes)
    redirect_to bills_path(@bill)
  end

  def show
    puts bill_params
    if params[:bill]
      @bill = Bill.where(bill_params).first_or_create do |bill|
        bill.attributes = bill_attributes
      end
    else
      @bill = Bill.find(params[:id])
    end
    @subjects = Subject.where("bill_id = ?", @bill[:id])
    @bill_comments = Comment.where("target = ?", @bill[:id])
  end

路线文件

...
  resources :bills do
    get :find_by_attributes
  end
...

编辑

我在rails应用程序中使用了turbolinks gem。

1 个答案:

答案 0 :(得分:0)

我在这里看到的是您正在呼叫

redirect_to bills_path(@bill)

从理论上讲,这不是展示路径,您只需删除“ s”

redirect_to bill_path(@bill)

并且作为补充,在这一行中,您不需要第一部分,因为find_b查找符合指定条件的第一条记录,因此可以删除该部分。

@bill = Bill.find_by( params )