首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby MVC和text_field

Ruby MVC和text_field
EN

Stack Overflow用户
提问于 2020-04-14 23:54:20
回答 2查看 41关注 0票数 0

我有一段我不太理解的代码:

app\controllers\look_controller.rb

代码语言:javascript
复制
class LookController < ApplicationController
 def at
  @data_hash = params[:cruncher]
  @cruncher = Cruncher.new(@data_hash[:crunch])
  @data = @cruncher.crunch
 end
 def input
 end
end

app\models\cruncher.rb

代码语言:javascript
复制
class Cruncher
 attr_reader :crunch
 attr_writer :crunch
 def initialize(data)
  @crunch = data
 end
end

app\views\look\input.rhtml:

代码语言:javascript
复制
<html>
 <head>
  <title>Using Text Fields</title>
 </head>
 <body>
  <h1>Working With Text Fields</h1>
  This Ruby on Rails application lets you read data from text fields.
 <br>
 <%= start_form_tag ({:action => “at”}, {:method => “post”}) %>
 Please enter your name.
 <br>
 <%= text_field (“cruncher”, “crunch”, {“size” => 30}) %>
 <br>
 <br>
 <input type=”submit”/>
 <%= end_form_tag %>
 </body>
</html>

我不明白<%= text_field (“cruncher”, “crunch”, {“size” => 30}) %>和模型之间的关系是什么。text_fields属性cruncher和crunch与模型有什么关系?

据我所知,params是一个特殊的散列,用于存储来自用户的数据,通过在控制器中使用@data_hash = params[:hash],我们可以存储这些数据。

但是这个@cruncher = Cruncher.new(@data_hash[:crunch])呢,为什么我们现在使用@data_hash[:crunch]呢?

为什么不只使用@data_hash?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-04-15 01:05:01

如果查看输入视图生成的html,您将看到文本字段如下所示:

代码语言:javascript
复制
<input type="text" name="cruncher_crunch" value="cruncher[crunch]" size="30" />

这意味着提交表单时创建并发送到LookController#at方法的参数散列的格式如下:

代码语言:javascript
复制
{cruncher: {crunch: 'somevalue'}}

这正是Cruncher.new(@data_hash[:cruncher])所期望的格式。

票数 1
EN

Stack Overflow用户

发布于 2020-04-15 05:38:42

你不理解它并不奇怪。

这段代码可能太老了(.rhtmlstart_form_tag把它放在Rails 1或2中),而且非常糟糕,它甚至不能运行,因为有两个语法错误,还有看起来像是将代码粘贴到MS Word中的工件的引号

代码语言:javascript
复制
# don't put a space before parens when calling methods in Ruby!
text_field (“cruncher”, “crunch”, {“size” => 30})

它还将在@data = @cruncher.crunch上提供NoMethodError。

在Rails 5中,同样的例子可以写成:

代码语言:javascript
复制
class Cruncher
  include ActiveModel::Model
  attr_accessor :crunch

  def crunch
    # have no idea what this was supposed to do
  end
end
代码语言:javascript
复制
class LookController < ApplicationController
  def at
    @cruncher = Cruncher.new(cruncher_params)
    @data = @cruncher.crunch
  end

  private

  def cruncher_params
    params.fetch(:cruncher).permit(:crunch)
  end
end
代码语言:javascript
复制
# I really have no idea what the actual routes are supposed to be
<%= form_for(@cruncher, url: '/look/at') do %>
  <%= f.text_field(:crunch size: 30) %>
<% end %>

不过,它仍然只是一个奇怪的非RESTful示例。有时垃圾代码最好被埋没。

我不明白<%= text_field (“cruncher”,“crunch”,{“size”=> 30}) %>和模型之间的关系。text_fields属性cruncher和crunch与模型有什么关系?

没什么。没有数据绑定。这只是一个简单的文本输入。

但是这个@

= Cruncher.new( @data_hash:crunch )怎么办,为什么我们现在使用@data_hash:crunch呢?

因为作者不知道他们在做什么。并且可能还没有意识到可以将散列传递给您的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61211908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档