Ошибка при создании новой формы: ActionView :: Template :: Error (неопределенный метод `title ' - PullRequest
0 голосов
/ 23 апреля 2020

Может кто-нибудь помочь мне сделать форму? Я продолжаю получать ActionView :: Template :: Error (неопределенный метод `title 'для #):

UrlsController

' ''

class UrlsController < ApplicationController
  def url_params
    params.require(:url).permit(:title, :link)
  end

  def create
    @url = Url.create!(url_params)
    flash[:notice] = "#{@url.title} was successfully created."
    @url.save
  end

  def new
    @url = Url.new
  end

  def edit
    @url = Url.find(params[:id])
  end

  def update 
    @url = Url.find params[:id]
    @url.update_attributes!(url_params)
    flash[:notice] = "#{@url.title} was successfully updated."
  end
end

'' '

new. html .erb

'' '

  <h2>Add A URL Reference</h2>
  <%= form_for Url.new do |f| %>
      <%= f.label :title %><br />
      <%= f.text_field  :title %>
      <%= f.label :link %><br />
      <%= f.text_field  :link %>
      <%= f.button :submit %>
  <% end %>

' ''

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вы использовали create с ударом (!) В @url = Url.create!(url_params). Возникает исключение, когда запись не создается. Следовательно, если @url не создан, он выдаст ошибку и когда вы вызовете title для экземпляра. Как предложил @Tolase Adegbite. Удалить код с ударом. Инициализируйте объект, затем вызовите оператор сохранения без взрыва. Если вы хотите использовать * bang sh, используйте блок начала и спасения.

0 голосов
/ 23 апреля 2020

Я бы посоветовал вам выполнить рефакторинг вашего кода следующим образом ..

Вы можете принять к сведению set_url в приват, чтобы предотвратить повторение кодов

class UrlsController < ApplicationController
  before_action :set_url, only: [:show, :edit, :update, :destroy]

  def new
    @url = Url.new
  end

  def edit
  end

  def create
    @url = Url.new(url_params)

    if @url.save
      flash[:success] = Your url was successfully published!]
      redirect_to @url
    else
      render :new
    end
  end

  def update
    if @url.update(url_params)
      flash[:success] = Your url was successfully updated!]
      redirect_to @url
    else
      render :edit 
    end
  end

  private
    def set_url
      @url = Url.find(params[:id])
    end

    def url_params
      params.require(:url).permit(:title, :link)
    end
end

new. html. erb

<h1>New Form</h1>
<%= render 'form', url: @url%>

_form.html.erb

<%= form_for @url do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title %>

  <%= f.label :link %>
  <%= f.text_field :link%>

  <%= f.submit %>
<% end %>

rout.rb

resources :urls

Если вы будете использовать devise для аутентификации, вы можете проверить документацию devise.

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