我是Rails的新手,我正在尝试编写Rails shortener应用程序的问题。
我正在关注此应用的Youtube教程:http://www.youtube.com/watch?v=q67bJ0yC2SM
有人可以帮我理解从新动作到创作的流程控制吗?我不了解新操作如何将数据输入表单和创建操作是如何工作的。
我在新动作中设置了绑定撬。当程序命中binding.pry时,这是存储在params中的内容。在点击新操作时,表单中没有输入任何原始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然后我在表单中输入一个地址。
当它命中下一个绑定撬时,程序现在处于创建操作中,现在设置了原始URL,并且random_id为=“”。
我尝试将新方法中的字母和@url_random_id移动到创建中,然后收到错误消息。
未定义的方法`random_id ='代表nil:NilClass
这是我控制器中的代码。
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 %>
提前感谢您提供的任何帮助,帮助我了解我做错了什么。
如果您需要有关我要做的事情的任何其他信息,请与我们联系。
答案 0 :(得分:0)
更改为
<%= f.hidden_field :random_id, :value => @url.random_id %> # note the dot, to match what you set in the controller.
然后,当您将表单提交到create
操作时,您将可以访问params[:url][:random_id]
,其中包含提交表单时隐藏字段中的内容的值:
@url = Url.new(params[:url]) # contains params[:url][:random_id]