2015-07-01 4 views
0

FriendlyID, похоже, не находит запись базы данных с соответствующим слизью.FriendlyID не находит запись с соответствующим слипом

Вот что консоль показывает:

Started GET "/ бюджеты/напитки" для 127.0.0.1 в 2015-07-01 12:42:53 +0200 обработки на BudgetsController # показать как HTML Параметры: {«id» => «drinks»} Бюджетная нагрузка (0.2ms) SELECT «бюджеты». * FROM «бюджеты» ГДЕ «бюджеты». «Slug» = «напитки» ORDER BY «бюджеты». «Id» ASC LIMIT 1 User Load (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" ГДЕ "money_transactions" транзакций "." budget_id "=? [["budget_id", 17]]
Бюджетная нагрузка (0,1 мс) ВЫБЕРИТЕ «бюджеты». * FROM «бюджеты» WHERE «бюджеты». «user_id» =? [["user_id", 1]] Представлено budgets/_budget_overview.html.erb (5.5ms) Представлено budgets/_form.html.erb (7.0ms) Изображенные бюджеты/show.html.erb в пределах макеты/приложение (26.3 мс) Завершенный 200 OK в 224ms (Просмотров: 213.5ms | ActiveRecord: 1.0ms)

Начато POST "/ money_transactions" для 127.0.0.1 в 2015-07-01 12:43:06 +0200 Обработка по MoneyTransactionsController #create в HTML Параметры: { "utf8" => "✓", "authenticity_token" => "EPcX4adigoTRY6A1doxWpdMM9eXy/KyqY84zKp855bE =", " money_transaction" => { "budget_id" => "напитки", "количество" = > "24", "title" => "coke"}, "button" => ""} Пользовательская нагрузка (0.2ms) SELECT «users». * FROM «users» WHERE «users». «id» = 1 ORDER BY «users». «id» ASC LIMIT 1 Бюджетная нагрузка (0.2ms) SELECT «бюджеты». * FROM «бюджеты» WHERE «бюджеты». «Slug» = «напитки» ORDER BY «бюджеты». «Id» ASC LIMIT 1
(0.1ms) начать транзакцию Бюджетная нагрузка (0.1ms) SELECT «бюджеты». * ОТ «бюджеты» ГДЕ «бюджеты». «id» =? ПРЕДЕЛ 1 [[ "Идентификатор", 0]]
(0,1 мс) откат транзакции (0.0ms) начать транзакцию (0,1 мс) откат транзакции Перенаправлено с http://localhost:3000/budgets/drinks завершенного 302 найдено в 14ms (ActiveRecord: 0.7ms)

Это показывает, что пул существует и правильно связан с идентификатором, когда я обращаюсь к странице. Однако после того, как ищет для записи с улиток «напитков» он возвращает только идентификатор 0.

Бюджет нагрузки (0,2 мс) ВЫБРАТЬ «бюджет». * FROM «бюджетов», где «бюджеты».» slug "=« напитки »ORDER BY« бюджеты ».« id »ASC LIMIT 1
(0.1ms) начать транзакцию Бюджетная нагрузка (0,1 мс) SELECT« бюджеты ». * ОТ« бюджеты »ГДЕ« бюджеты ». id знак равно LIMIT 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 

.Р.Б.

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 

бюджеты/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 и никогда не испытывал проблем. Я надеюсь, что вы можете мне помочь.

EDIT: Так что я нашел обходное решение. Но я чувствую, что должно быть более простое решение. Я сменил свое скрытое поле на:

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

Теперь он работает. Но если у вас есть лучшее решение, пожалуйста, дайте мне знать.

+0

У вас есть атрибуты называемых пробковой в вашу соответствующую модель, которая в настоящее время используется расширение на дружественно ID, пожалуйста, попробуйте запрос в рельсах консоль, может помочь вам решить проблемы. –

+0

Спасибо за быстрый ответ. Я проверил в консоли Rails, и я могу найти модель с ее пулей: > Budget.where (: slug => "drinks") Бюджетная нагрузка (4.0ms) ВЫБЕРИТЕ «бюджеты». * FROM «бюджеты» WHERE «бюджеты». «Slug» = «drinks» => # , refresh_rate: nil, created_at: "2015-06-30 12:22:34", updated_at: "2015-06-30 12:22:34", user_id: 1, slug: "drinks">]> – sam

+0

параметры должны входить в slug не в id. –

ответ

0

Не используйте FriendlyID для параметров формы - просто используйте прямой идентификатор. Это позволяет рельсам автоматически добавлять связь и приводит к гораздо более эффективному 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 
+0

Это выглядит намного приятнее и проще, чем мой глупый обходной путь. Большое спасибо! – sam

+0

Я только что увидел, что вы создавали форму из метода # # бюджета. Удалено # новое действие из моего ответа. – max

Смежные вопросы