【问题标题】:FriendlyID does not find entry with matching slugFriendlyID 找不到具有匹配 slug 的条目
【发布时间】:2015-09-18 11:48:14
【问题描述】:

FriendlyID 似乎没有找到具有相应 slug 的数据库条目。

这是控制台显示的内容:

在 2015-07-01 12:42:53 开始为 127.0.0.1 获取“/budgets/drinks” +0200 BudgetsController 处理#show as HTML 参数:{"id"=>"drinks"} 预算负载 (0.2ms) SELECT "budgets".* FROM "budgets" WHERE "budgets"."slug" = 'drinks' ORDER BY "budgets"."id" ASC LIMIT 1 用户负载 (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 MoneyTransaction 加载 (0.5ms) SELECT "money_transactions".* FROM "money_transactions" WHERE "money_transactions"."budget_id" = ? [["budget_id", 17]]
预算负载 (0.1ms) SELECT "budgets".* FROM "budgets" WHERE "预算"."user_id" = ? [["user_id", 1]] 渲染 budgets/_budget_overview.html.erb (5.5ms) 渲染 budgets/_form.html.erb (7.0ms) 内渲染的budgets/show.html.erb 布局/应用程序(26.3 毫秒)在 224 毫秒内完成 200 次 OK(查看次数:213.5 毫秒 |活动记录:1.0 毫秒)

于 2015 年 7 月 1 日开始为 127.0.0.1 发布“/money_transactions” 12:43:06 +0200 由 MoneyTransactionsController#create 处理 HTML 参数:{"utf8"=>"✓", "authenticity_token"=>"EPcX4adigoTRY6A1doxWpdMM9eXy/KyqY84zKp855bE=", "money_transaction"=>{"budget_id"=>"drinks", "amount"=>"24", "title"=>"coke"}, "button"=>""} 用户负载 (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 预算负载 (0.2ms) SELECT "budgets".* FROM "budgets" WHERE "budgets"."slug" = 'drinks' ORDER BY "budgets"."id" ASC LIMIT 1
(0.1ms) 开始事务预算加载 (0.1ms) SELECT "budgets".* 从“预算”到“预算”。“id”=?限制 1 [["id", 0]]
(0.1ms) 回滚事务 (0.0ms) 开始事务 (0.1ms) 回滚事务重定向到 http://localhost:3000/budgets/drinks 已完成 302 发现时间为 14 毫秒 (ActiveRecord: 0.7ms)

这表明 slug 存在并且在我访问页面时与 ID 正确相关。然而,在寻找一个带有 slug “drinks” 的条目后,它只返回一个 ID 0。

预算负载 (0.2ms) SELECT "budgets".* FROM "budgets" WHERE "budgets"."slug" = 'drinks' ORDER BY "budgets"."id" ASC LIMIT 1
(0.1ms) 开始事务预算加载 (0.1ms) SELECT "budgets".* 从“预算”到“预算”。“id”=?限制 1 [["id", 0]]

money_transaction_controller.rb

def create
    @budget = Budget.friendly.find(params[:money_transaction][:budget_id])
    @money_transaction = MoneyTransaction.new(money_transaction_params)
    @money_transaction.user = current_user
    @money_transaction.date = Time.now.to_date
    @money_transaction.is_positive = 0

    @money_transaction.save

    respond_to do |format|
      if @money_transaction.save
        format.html { redirect_to @budget, notice: 'Transaction added.'}
        format.json { render :show, status: :created, location: @budget }
      else
        format.html { redirect_to @budget, alert: 'Transaction was not valid.'}
        format.json { render json: @money_transaction.errors, status: :unprocessable_entity }
      end
    end
  end

budget.rb

class Budget < ActiveRecord::Base
  belongs_to :user
  has_many :money_transactions

  validates :amount, presence: true
  validates :title, presence: true
  validates :user, presence: true
  validates :amount, numericality: true

  extend FriendlyId
  friendly_id :title, use: :slugged

  def should_generate_new_friendly_id?
    new_record?
  end
end

budgets/show.html.erb

<%= form_for(@budget.money_transactions.build, :html => { :id => 'money_transaction-form' }) do |f| %>
      <%= f.hidden_field :budget_id, :value => params[:id] %>

      <%= f.number_field :amount, id: "transaction-input", placeholder: "#{@budget.title} ", step: 0.01, :autocomplete => :off %>

      <%= f.text_field :title, class: "", placeholder: "purpose", :autocomplete => :off %>

      <%= f.button(type: 'submit', class: "postfix") do %>
          <i class="fa fa-arrow-right"></i>
      <% end %>

<% end %>

routes.rb

  get '/pages', to: 'pages#index'

  devise_for :users
  resources :users

  resources :budget
  resources :money_transactions


  root :to => 'budgets#index'

如果您需要任何其他文件,请告诉我。我以前使用friendlyID,从来没有遇到过问题。我希望你能帮助我。

编辑: 所以我找到了一个解决方法。但我觉得应该有一个更简单的解决方案。我将隐藏字段更改为:

<%= f.hidden_field :budget_id, :value => Budget.where(:slug => params[:id]).last.id %>

现在可以了。但如果您有更好的解决方案,请告诉我。

【问题讨论】:

  • 您的对应模型中是否有一个名为 slug 的属性,该属性当前正在使用 friendly-id 扩展,请尝试在 rails 控制台中查询,可能会帮助您解决问题。
  • 感谢您的快速响应。我确实检查了 Rails 控制台,我可以找到带有 slug 的模型: > Budget.where(:slug => "drinks") Budget Load (4.0ms) SELECT "budgets".* FROM "budgets" WHERE "budgets" ."slug" = 'drinks' => #<:relation id: title: amount:>, refresh_rate : nil, created_at: "2015-06-30 12:22:34", updated_at: "2015-06-30 12:22:34", user_id: 1, slug: "drinks">]>
  • 参数应该在 slug 中而不是在 id 中。
  • 尝试更新你的路线兄弟。
  • 对不起,你到底是什么意思?我应该更新哪条路线?

标签: ruby-on-rails ruby ruby-on-rails-4 friendly-id


【解决方案1】:

不要将 FriendlyID 用于表单参数 - 只需使用直接 ID。这让 Rails 可以自动添加关联并产生更有效的 SQL 查询。

<%= form_for(@budget.money_transactions.build, :html => { :id => 'money_transaction-form' }) do |f| %>
  <%= f.hidden_field :budget_id, value: @budget.id %>
  <%= f.number_field :amount, id: "transaction-input", placeholder: "#{@budget.title} ", step: 0.01, :autocomplete => :off %>
  <%= f.text_field :title, class: "", placeholder: "purpose", :autocomplete => :off %>
  <%= f.button(type: 'submit', class: "postfix") do %>
    <i class="fa fa-arrow-right"></i>
  <% end %>
<% end %>

这样你就可以清理你的控制器了:

def create
  @money_transaction = MoneyTransaction.new(money_transaction_params) do |mt|
    mt.user = current_user
    mt.date = Time.now.to_date
    mt.is_positive = 0
  end
  respond_to do |format|
    if @money_transaction.save
      format.html { redirect_to @budget, notice: 'Transaction added.'}
      format.json { render :show, status: :created, location: @budget }
    else
      format.html { redirect_to @budget, alert: 'Transaction was not valid.'}
      format.json { render json: @money_transaction.errors, status: :unprocessable_entity }
    end
  end
end

【讨论】:

  • 这看起来比我愚蠢的解决方法更好更简单。非常感谢!
  • 我刚刚看到您正在从budget#show 方法创建表单。从我的回答中删除了#new 操作。
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多