Не умеет связывать определенные маршруты в коде, но может получить к ним доступ, введя их вручную в браузер - PullRequest
0 голосов
/ 06 октября 2018

Я относительно новичок в Rails и столкнулся с проблемой, которую не могу решить.

Я настроил модель вложенного ресурса с именем Captable.Он принадлежит компании.

Если перейти к определенному виду: например, http://localhost:3000/companies/9/captables/1 - все отлично работает.Я вижу правильные данные.

У меня есть две основные проблемы, которые я не могу решить, я думаю, что они связаны с соглашениями о присвоении имен или маршрутами.

Во-первых, когда я пытаюсь получить доступ http://localhost:3000/companies/9/captables/new - я получаю следующую ошибку.

NoMethodError in Captables#new
Showing /Users/jamespember/calmcap/app/views/captables/_form.html.erb where line #2 raised:

undefined method `captables_path' for #<#<Class:0x00007f8a08edebc8>:0x00007f8a0984bfa8>
Extracted source (around line #2):
1
2
3
4
5
6


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

  <% if @captable.errors.any? %>
    <div id="error_explanation">
      <h2>

Во-вторых, если я попробую ссылку на ссылку company_captables_path со страницы /companies/, используя приведенную ниже, я получу следующую ошибку.

View Cap Table: <%= link_to(@company.company_captables_path) %>

Ошибка:

 Showing /Users/jamespember/calmcap/app/views/companies/show.html.erb where line #30 raised:

undefined method `company_captables_path' for #<Company:0x00007f8a046a6630>

Вот некоторые фрагменты кода:

rout.rb

Rails.application.routes.draw do

  devise_for :users
  get 'dashboard/index'

  root 'companies#index'

  resources :companies do
    resources :shareholders
    resources :captables
  end

end

captable.rb

class Captable < ApplicationRecord
  belongs_to :company
end

captables_controller.rb

class CaptablesController < ApplicationController
  before_action :set_captable, only: [:show, :edit, :update, :destroy]

  def index
    @captables = Captable.all 
  end

  def show
    @captable = Captable.find(params[:id])
  end

  def new
    @captable = Captable.new
  end

  def edit
  end

  def create
    @captable = Captable.new(captable_params)

    respond_to do |format|
      if @captable.save
        format.html { redirect_to @captable, notice: 'Captable was successfully created.' }
        format.json { render :show, status: :created, location: @captable }
      else
        format.html { render :new }
        format.json { render json: @captable.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @captable.update(captable_params)
        format.html { redirect_to @captable, notice: 'Captable was successfully updated.' }
        format.json { render :show, status: :ok, location: @captable }
      else
        format.html { render :edit }
        format.json { render json: @captable.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @captable.destroy
    respond_to do |format|
      format.html { redirect_to captables_url, notice: 'Captable was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    def set_captable
      @captable = Captable.find(params[:id])
    end

    def captable_params
      params.require(:captable).permit(:version, :name, :company_id)
    end
end

captables / show.html.erb

<p id="notice"><%= notice %></p>

<p>
  <strong>Version:</strong>
  <%= @captable.version %>
</p>

<p>
  <strong>Name:</strong>
  <%= @captable.name %>
</p>

<p>
  <strong>Company:</strong>
  <%= @captable.company_id %>
</p>

captables / _form.html.erb - РЕДАКТИРОВАТЬ Обновлено

<%= form_with(model: [@company, @captable], local: true) do |form| %>

  <% if @captable.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@captable.errors.count, "error") %> prohibited
        this article from being saved:
      </h2>
      <ul>
        <% @captable.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= form.submit %>
  </p>

<% end %>

schema.rb

Вот схема для таблицы:

  create_table "captables", force: :cascade do |t|
    t.integer "version"
    t.text "name"
    t.integer "company_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

Наконец, вот скриншот моего rails routes.

enter image description here

Ошибка при попытке доступа /companies/:id/captables/new

enter image description here

1 Ответ

0 голосов
/ 06 октября 2018

Вспомогательные методы маршрута rails добавляются в контекст представления и контроллер, а не модели.

Ссылка должна выглядеть следующим образом:

<%= link_to("Link text", company_captables_path(@company)) %>

Что является неявным вызовом:

<%= link_to("Link text", self.company_captables_path(@company)) %>

self является контекстом представления.

При создании формы для вложенного маршрута вы должны передать массив:

<%= form_with(model: [@company, @captable], local: true) do |form| %>
   # ...
<% end %>

Вы также должны создать новыйэкземпляр из ассоциации:

class CaptablesController < ApplicationController
  before_action :set_company
  before_action :set_captable, only: [:show, :edit, :update, :destroy]

  # GET /companies/:company_id/captables/new
  def new
    @captable = @company.captables.new
  end

  # POST /companies/:company_id/captables
  # POST /companies/:company_id/captables.json
  def create
    @captable = @company.captables.new(captable_params)

    respond_to do |format|
      if @captable.save
        format.html { redirect_to @captable, notice: 'Captable was successfully created.' }
        format.json { render :show, status: :created, location: @captable }
      else
        format.html { render :new }
        format.json { render json: @captable.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    def set_company
      @company = Company.find(params[:company_id])
    end

    # ...
end
...