0

我是 Rails 新手,我正在尝试编写 Rails 缩短器应用程序时遇到问题。

我正在关注这个应用程序的 Youtube 教程: http ://www.youtube.com/watch?v=q67bJ0yC2SM

有人可以帮我理解从新动作到创建的流程控制吗?我不了解新操作、将数据输入表单和创建操作是如何工作的。

我在新动作中设置了一个绑定撬。在程序命中 binding.pry 时,这就是存储在参数中的内容。在执行新操作时,原始 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 上,然后我在表单中输入一个地址。

当它点击下一个绑定 pry 时,程序现在处于创建操作中,并且现在设置了原始 url,并且 random_id 为 = ""。

我尝试将字母和@url_random_id 从新方法移动到创建,然后收到一条错误消息。

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

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]
于 2013-10-19T01:54:09.090 回答