URL Shortener随机ID未设置

时间:2013-10-18 22:53:47

标签: ruby-on-rails

我是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 %>

提前感谢您提供的任何帮助,帮助我了解我做错了什么。

如果您需要有关我要做的事情的任何其他信息,请与我们联系。

1 个答案:

答案 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]