【问题标题】:Redirecting to "show" view of a model object when searched by attributes (NOT id)按属性搜索时重定向到模型对象的“显示”视图(非 ID)
【发布时间】:2018-09-11 21:35:44
【问题描述】:

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

@bill = Bill.find_by( params ).first

正确获取相应账单的id。

现在我只想重定向到这个账单的“show”方法,就像在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。

【问题讨论】:

  • rails 日志显示什么? (当您进行重定向时,它会显示一个重定向状态代码和两个连续的请求)浏览器在网络选项卡上显示什么? (当您收到重定向时,它会显示您被重定向到的 url)如果您禁用 turbolink 只是为了测试它仍然会发生吗?
  • 一切都显示为 200,加载正常,除了 URL 不应该是这样之外,没有任何意外。禁用 turbolinks 会杀死链接,所以我认为 redirect_to 是 turbolinks gem 的一部分。
  • “杀死”“链接”是什么意思?它是一种形式,“杀”是什么意思?某处有什么错误吗? redirect_to 是一种 Rails 方法,与 turbolink 无关(turbolink 工作在客户端,而不是服务器端)。您的路线显示“find_by_attributes”,但您的表单指向“find_or_create”。也复制你的 rails 日志,看起来你没有指向正确的操作(你应该使用命名路由而不是硬编码的 url)

标签: ruby-on-rails controller routing turbolinks


【解决方案1】:

我在这里看到的是你在打电话给

redirect_to bills_path(@bill)

理论上不是显示路径,你只需要去掉“s”

redirect_to bill_path(@bill)

作为旁注,在这一行中,您不需要第一部分,因为 find_b 会找到符合指定条件的第一条记录,您可以删除该部分。

@bill = Bill.find_by( params )

【讨论】:

  • 我按照您的建议删除了不必要的“s”,但这并没有解决问题。此时唯一的问题是当我重定向时 URL 没有改变。看起来它应该是一个非常简单的修复......
  • 那么请将您的路线文件添加到问题中
  • 我添加了建立与账单有关的路线的部分。如果这还不够,请告诉我,我会添加更多。
  • 理论上它必须与您的路线一起使用。也许您的控制器中有一个之前的操作/过滤器?请发出请求并在控制台中的日志服务器上查看并将其添加到问题中
猜你喜欢
  • 2013-03-09
  • 2019-09-14
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2013-02-14
  • 2016-01-27
  • 1970-01-01
相关资源
最近更新 更多