Ruby MVC и текстовое поле - PullRequest
       9

Ruby MVC и текстовое поле

0 голосов
/ 14 апреля 2020

У меня есть этот код, который я не совсем понимаю:

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
end

app \ models \ cruncher.rb

class Cruncher
 attr_reader :crunch
 attr_writer :crunch
 def initialize(data)
  @crunch = data
 end
end

app \ views \ look \ input.r html:

<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 - это специальный ha sh, в котором хранятся данные от пользователя, и, используя @data_hash = params[:hash] внутри контроллера, мы сохраняем эти данные.

Но как насчет этого @cruncher = Cruncher.new(@data_hash[:crunch]), почему мы сейчас используем @data_hash[:crunch]?

Почему бы просто не @data_hash?

Спасибо.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Не странно, что вы этого не понимаете.

Этот код, вероятно, нелепо стар (.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})

Это также даст NoMethodError на @data = @cruncher.crunch.

В Rails 5 тот же пример можно записать так:

class Cruncher
  include ActiveModel::Model
  attr_accessor :crunch

  def crunch
    # have no idea what this was supposed to do
  end
end
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
# 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 = Cruncher.new (@data_hash [: crunch]), почему мы теперь используем @data_hash [: crunch]?

Потому что автор не знал, что они делают. И, вероятно, не понял, что вы можете передавать хэши своим методам.

1 голос
/ 14 апреля 2020

если вы посмотрите на он html, созданный в представлении ввода, вы увидите что-то вроде этого для текстового поля:

<input type="text" name="cruncher_crunch" value="cruncher[crunch]" size="30" />

это означает, что параметры ha sh, созданные при форма будет отправлена ​​и отправлена ​​методу LookController#at, который будет отформатирован следующим образом:

{cruncher: {crunch: 'somevalue'}}

- это именно тот формат, который ожидает Cruncher.new(@data_hash[:cruncher]).

...