2013-10-18 70 views
0

我是Rails新手,並且遇到與我正在嘗試編寫的Rails縮短應用程序有關的問題。URL Shortener隨機標識未設置

我下面在Youtube上觀看教程這個應用程式:http://www.youtube.com/watch?v=q67bJ0yC2SM

有人可以幫助我深有體會,新行動的創建流量控制?我不理解新動作如何將數據輸入表單和創建動作。

我在新操作中設置了綁定pry。當程序碰到binding.pry時,這就是存儲在params中的東西。當新行動被擊中時,原始身份證的表格中沒有任何內容被輸入。

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從新方法移動到創建,然後獲取錯誤消息。

未定義的方法`random_id =」爲零: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

更改爲

<%= 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] 
+0

完美運作。無論表單中輸入的URL長度如何,@random_id似乎總是8個字符。如果算法設置爲5個字符而不是8個,則縮短的URL的長度將始終爲5而不是8。是正確的嗎?感謝您的及時回覆。感謝幫助! – user2275037