我有一段我不太理解的代码:
app\controllers\look_controller.rb
class LookController < ApplicationController
def at
@data_hash = params[:cruncher]
@cruncher = Cruncher.new(@data_hash[:crunch])
@data = @cruncher.crunch
end
def input
end
endapp\models\cruncher.rb
class Cruncher
attr_reader :crunch
attr_writer :crunch
def initialize(data)
@crunch = data
end
endapp\views\look\input.rhtml:
<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?
谢谢。
发布于 2020-04-15 01:05:01
如果查看输入视图生成的html,您将看到文本字段如下所示:
<input type="text" name="cruncher_crunch" value="cruncher[crunch]" size="30" />这意味着提交表单时创建并发送到LookController#at方法的参数散列的格式如下:
{cruncher: {crunch: 'somevalue'}}这正是Cruncher.new(@data_hash[:cruncher])所期望的格式。
发布于 2020-04-15 05:38:42
你不理解它并不奇怪。
这段代码可能太老了(.rhtml和start_form_tag把它放在Rails 1或2中),而且非常糟糕,它甚至不能运行,因为有两个语法错误,还有看起来像是将代码粘贴到MS Word中的工件的引号
# don't put a space before parens when calling methods in Ruby!
text_field (“cruncher”, “crunch”, {“size” => 30})它还将在@data = @cruncher.crunch上提供NoMethodError。
在Rails 5中,同样的例子可以写成:
class Cruncher
include ActiveModel::Model
attr_accessor :crunch
def crunch
# have no idea what this was supposed to do
end
endclass LookController < ApplicationController
def at
@cruncher = Cruncher.new(cruncher_params)
@data = @cruncher.crunch
end
private
def cruncher_params
params.fetch(:cruncher).permit(:crunch)
end
end# 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呢?
因为作者不知道他们在做什么。并且可能还没有意识到可以将散列传递给您的方法。
https://stackoverflow.com/questions/61211908
复制相似问题