我是 Rails 新手,我正在尝试编写 Rails 缩短器应用程序时遇到问题。
我正在关注这个应用程序的 Youtube 教程: http ://www.youtube.com/watch?v=q67bJ0yC2SM
有人可以帮我理解从新动作到创建的流程控制吗?我不了解新操作、将数据输入表单和创建操作是如何工作的。
我在新动作中设置了一个绑定撬。在程序命中 binding.pry 时,这就是存储在参数中的内容。在执行新操作时,原始 ID 的表单中没有输入任何内容。
17: def new
18: @url = Url.new
19:
20: letters = [('a'..'z'), ('A'..'Z')].map { |l| l.to_a }.flatten
21: @url.random_id = (0...8).map { letters[rand(letters.length)] }.join
=> 22: binding.pry
23: end
[1] pry(#<UrlsController>)> @url.random_id
=> "ogEJCcHm"
[2] pry(#<UrlsController>)> @url.original
=> nil
[3] pry(#<UrlsController>)> params
=> {"action"=>"new", "controller"=>"urls"}
[4] pry(#<UrlsController>)>
退出绑定 pry 后,表单现在加载到 localhost:3000 上,然后我在表单中输入一个地址。
当它点击下一个绑定 pry 时,程序现在处于创建操作中,并且现在设置了原始 url,并且 random_id 为 = ""。
我尝试将字母和@url_random_id 从新方法移动到创建,然后收到一条错误消息。
nil:NilClass 的未定义方法“random_id=”
这是我的控制器中的代码。
class UrlsController < ApplicationController
def index
@urls = Url.all
end
def show
url = Url.where(random_id: params[:id]).first
if url
redirect_to url.original
else
render 'new'
end
end
def new
@url = Url.new
letters = [('a'..'z'), ('A'..'Z')].map { |l| l.to_a }.flatten
@url.random_id = (0...8).map { letters[rand(letters.length)] }.join
binding.pry
end
def url_params
params.require(:url).permit(:original, :random_id)
end
def create
binding.pry
@url = Url.new(url_params)
#binding.pry
if @url.save
redirect_to urls_path
else
render 'new'
end
end
end
我的路线文件中有以下内容:
Urly::Application.routes.draw do
root :to => redirect('/urls/new')
resources :urls, :only => [:index, :show, :new, :create]
end
我的 new.html.erb 文件中有以下内容:
<%= form_for @url do |f| %>
<%= f.label :original %> : <%= f.text_field :original %>
<p>
<%= f.hidden_field :random_id, :value => @url_random_id %>
</p>
<p>
<%= f.submit "Shorten my Url" %>
</p>
<% end %>
在此先感谢您提供的任何帮助,以帮助我了解我做错了什么。
如果您需要有关我正在尝试做的任何其他信息,请告诉我。