创建新表单时出错:ActionView :: Template :: Error(未定义的方法'title'

问题描述 投票:0回答:1

有人可以帮我做一个表格吗?我不断收到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 %>

'''

ruby-on-rails forms controller ruby-on-rails-5 erb
1个回答
0
投票

我建议您像这样重构代码。

您可以私下记下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 %>

routes.rb

resources :urls

如果要使用devise进行身份验证,您将需要查看devise文档。

© www.soinside.com 2019 - 2024. All rights reserved.