私は Rails の初心者であり、作成しようとしている Rails 短縮アプリに問題があります。
このアプリの 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>)>
バインディング プライを終了すると、フォームは localhost:3000 に読み込まれ、フォームにアドレスを入力します。
次のバインディング プライにヒットすると、プログラムは作成アクションになり、元の URL が設定され、random_id は = "" になります。
文字と @url_random_id を new メソッドから create に移動しようとしたところ、エラー メッセージが表示されました。
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 %>
私が間違っていることを理解するのを助けるためにあなたが提供できる支援を前もって感謝します.
私がやろうとしていることについて追加情報が必要な場合はお知らせください。