Ошибка теста Rails при попытке найти связанную модель в тесте - PullRequest
0 голосов
/ 08 мая 2018

Я создаю библиотечную онлайн-систему с Ruby on Rails. В настоящее время пользователи могут зарегистрироваться, но для этого они должны сначала выбрать тип плана подписки.

В конце концов, лучший способ сделать это - передать plan_id примерно так:

config/routes.rb

get 'subscribe/paperback2u', to: 'members#new', :plan_id => 1
get 'subscribe/paperback4u', to: 'members#new', :plan_id => 2
get 'subscribe/paperback6u', to: 'members#new', :plan_id => 3

Затем members/new.html.erb извлекает партиал form, который выглядит следующим образом:

<%= form_with(model: member, local: true) do |form| %>
  <% plan_id = params[:plan_id] %>

  <div class="field form-group">
    <%= form.label :first_name, "First Name" %>
    <%= form.text_field :first_name, 
                        id: :member_first_name,
                        :class => "form-control",
                        :required => true %> 
  </div>

  <div class="field form-group">
    <%= form.label :last_name, "Last Name" %>
    <%= form.text_field :last_name,
                        id: :member_last_name,
                        :class => "form-control",
                        :required => true %>
  </div>

  <div class="field form-group">
    <%= form.label :address_line_1, "Address Line 1" %>
    <%= form.text_field :address_line_1,
                        id: :member_address_line_1,
                        :class => "form-control",
                        :required => true %>
  </div>

  <div class="field form-group">
    <%= form.label :address_line_2, "Address Line 2" %>
    <%= form.text_field :address_line_2,
                        id: :member_address_line_2,
                        :class => "form-control" %>
  </div>

  <div class="field form-group">
    <%= form.label :town %>
    <%= form.text_field :town,
                        id: :member_town,
                        :class => "form-control",
                        :required => true %>
  </div>

И другие поля для модели элемента.

Тогда мы получим:

 98 <%= form.hidden_field :plan_id, value: params[:plan_id] %>

100 <% if form.object.new_record? %>
101   <%= render 'stripe-form' %>
102 <% end %>

Не думаю, что line 98 делает что-нибудь, если честно.

Тогда частичное stripe-form выглядит следующим образом:

1  <div class="text-center">
2    <script src="https://checkout.stripe.com/checkout.js" class="stripe-button btn-primary"
3      data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
4      data-description="Subscribe to ReadAll Library"
5      data-amount=<%= (Plan.find(params["plan_id"].to_i).display_price) * 100 %>
6      data-currency="gbp"
7      data-panelLabel="Subscribe for"
8      data-label="Subscribe"
9      data-locale="auto"></script>
10 </div>

Я получаю ошибку:

Error:
MembersControllerTest#test_should_get_new:
ActionView::Template::Error: Couldn't find Plan with 'id'=1
    app/views/members/_stripe-form.html.erb:5:in `_app_views_members__stripe_form_html_erb___374722773566915779_70180218242520'
    app/views/members/_form.html.erb:101:in `block in _app_views_members__form_html_erb__2640496602018942691_70180179508500'
    app/views/members/_form.html.erb:1:in `_app_views_members__form_html_erb__2640496602018942691_70180179508500'
    app/views/members/new.html.erb:5:in `_app_views_members_new_html_erb___3025732295195500162_70180218177380'
    test/controllers/members_controller_test.rb:16:in `block in <class:MembersControllerTest>'

Я получаю ошибку, если добавлю puts response.body в тестах: «План должен существовать». Что это делает! У меня есть 3 разных плана в моей таблице plans. У каждого есть идентификатор, и все работает, когда я его запускаю. Это просто тест, который не работает. Я бы отказался от теста, если бы мог, но он мне нужен как документация для проекта.

Наконец, вот мои Plan.rb и Member.rb

`plan.rb`

 class Plan < ApplicationRecord
   has_many :members
 end

`member.rb`

   class Member < User
1    require 'stripe'
2 
3    before_save :set_type
4 
5    belongs_to :plan
6 
7 
8    def set_type
9      self.type = "Member"
10   end
11
12 end

И схема для двоих:

create_table "plans", force: :cascade do |t|
  t.string "stripe_id"
  t.string "nickname"
  t.decimal "display_price"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string "product"
end

create_table "users", force: :cascade do |t|
  bunch of user attributes (first_name, address, etc)
  t.string "type" (members is a users type)
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string "remember_digest"
  t.string "customer_id"
  t.bigint "plan_id"
  t.index ["email"], name: "index_users_on_email", unique: true
  t.index ["plan_id"], name: "index_users_on_plan_id"
end

У меня нет идей. Я ценю любую помощь, которую вы, ребята, можете оказать мне. Приветствия.

1 Ответ

0 голосов
/ 09 мая 2018

По вашему мнению, если вы хотите, чтобы ваш пользователь выбирал из формы, вы можете добавить выбранные входные данные и позволить пользователю выбирать, какой план он хочет.Но вполне возможно, что вы передадите эту информацию через URL, как вы уже сделали.

Вид:

<%= form_with(model: member, local: true) do |form| %>

  <div class="field form-group">
    <%= form.label :first_name, "First Name" %>
    <%= form.text_field :first_name, 
                        id: :member_first_name,
                        :class => "form-control",
                        :required => true %> 
  </div>

  <div class="field form-group">
    <%= form.label :plan, "Choose your plan" %>
    <%= form.select :plan_id, 
        Plan.all {|p| [ p.name, p.id ]}, 
        { include_blank: false, selected: form.object.plan_id }, class: 'form-control' %>
  </div>

  <%= f.submit "Salvar", class: "btn btn-primary" %>  
<% end %>

Полагаю, остальным ты уже это сделал.В контроллере вы добавляете в белый список параметров plan_id, а в вашей модели вы добавляете отношения модели как has_many и принадлежат.PS: Я не проверял это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...