Ruby on rails FriendlyID找不到具有匹配slug的条目

Ruby on rails FriendlyID找不到具有匹配slug的条目,ruby-on-rails,ruby,ruby-on-rails-4,friendly-id,Ruby On Rails,Ruby,Ruby On Rails 4,Friendly Id,FriendlyID似乎找不到具有相应slug的数据库条目 以下是控制台显示的内容: 于2015-07-01 12:42:53开始为127.0.0.1购买/预算/饮料 +0200由BudgetController以HTML参数显示的处理:{id=>饮料}预算加载0.2ms选择预算。*从 budgets,其中budgets.slug=“饮料”按budgets.id排序 ASC限制1用户负载0.2ms从用户中选择用户。* users.id=1 ORDER BY users.id ASC LIMIT

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

以下是控制台显示的内容:

于2015-07-01 12:42:53开始为127.0.0.1购买/预算/饮料 +0200由BudgetController以HTML参数显示的处理:{id=>饮料}预算加载0.2ms选择预算。*从 budgets,其中budgets.slug=“饮料”按budgets.id排序 ASC限制1用户负载0.2ms从用户中选择用户。* users.id=1 ORDER BY users.id ASC LIMIT 1 MoneyTransaction 加载0.5ms从货币交易中选择货币交易。* 其中money\u transactions.budget\u id=?[budget_id,17]] 预算加载0.1ms从预算中选择预算。* budgets.user_id=?[[user_id,1]]已渲染 预算/_budget_overview.html.erb 5.5ms渲染 预算/_form.html.erb 7.0ms渲染预算/show.html.erb 布局/应用程序26.3ms在224ms视图中完成200 OK:213.5ms |ActiveRecord:1.0ms

于2015年7月1日开始127.0.0.1的邮政/货币交易 12:43:06+0200通过MoneyTransactionControllerCreate处理创建为 HTML参数:{utf8=>✓, 真实性令牌=>EPCX4ADIGTORY6A1DOXWPDM9EXY/KyqY84zKp855bE=, 金钱交易=>{budget\u id=>饮料,金额=>24, title=>coke},button=>}用户加载0.2ms选择用户* 来自用户,其中users.id=1 ORDER BY users.id ASC LIMIT 1预算加载0.2ms从预算中选择预算。*其中 budgets.slug=“饮料”订单(按budgets.id ASC限制1) 0.1ms开始事务预算加载0.1ms选择预算* 来自budgets.id=?限制1[[id,0]] 0.1ms回滚事务0.0ms开始事务0.1ms 回滚事务重定向到 14毫秒内完成302次 活动记录:0.7ms

这表明slug存在,并且在我访问页面时与ID正确相关。但是,在查找包含slug饮料的条目后,它只返回ID为0的条目

预算加载0.2ms从预算中选择预算。*其中 budgets.slug=“饮料”订单(按budgets.id ASC限制1) 0.1ms开始事务预算加载0.1ms选择预算* 来自budgets.id=?限制1[[id,0]]

货币交易控制器.rb

预算.rb

如果您需要其他文件,请告诉我。我以前和friendlyID一起工作过,从来没有遇到过问题。我希望你能帮助我

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

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

现在它起作用了。但是如果你有更好的解决办法,请告诉我

不要对表单参数使用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 %>

您是否在当前使用友好id扩展的对应模型中有一个名为slug的属性,然后请在rails控制台中尝试查询,这可能会帮助您解决问题。感谢您的快速响应。我确实在Rails控制台中进行了检查,我可以找到带有slug:>Budget的模型。其中:slug=>drinks Budget Load 4.0ms选择budgets.*从budgets中选择budgets.slug='drinks'=>参数应该在slug中,而不是在id中。请尝试更新您的路线兄弟。对不起,您的确切意思是什么?我应该更新哪条路线?这看起来比我愚蠢的变通方法好得多,也简单得多。谢谢!我刚才看到您正在使用budgetshow方法创建表单。从我的回答中删除了新操作。
<%= 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 %>
  get '/pages', to: 'pages#index'

  devise_for :users
  resources :users

  resources :budget
  resources :money_transactions


  root :to => 'budgets#index'
<%= f.hidden_field :budget_id, :value => Budget.where(:slug => params[:id]).last.id %>
<%= 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