0

私は 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 %>

私が間違っていることを理解するのを助けるためにあなたが提供できる支援を前もって感謝します.

私がやろうとしていることについて追加情報が必要な場合はお知らせください。

4

1 に答える 1