Как работает метод post в Ruby on Rails - PullRequest
0 голосов
/ 15 декабря 2018

Я пришел из Python и Java с базовыми знаниями CSS, HTML, Ruby и пытаюсь изучить веб-разработку с использованием Ruby on Rails.Я пытаюсь следовать руководству по Michael Hartl .Я не понимаю, какие аргументы использует метод post в листинге 7.23.

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'
  end
end

Из того, что я прослеживаю в API , он принимает 2 необязательных аргумента, которые оба являются строками, но в листинге 7.23 есть неожиданный синтаксис хеша params: в2-й аргумент, и это смутило меня.Может ли кто-нибудь просветить меня?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Ах!Отличный вопросЭта строка:

class UsersSignupTest < ActionDispatch::IntegrationTest

означает, что класс наследуется от ActionDispatch::IntegrationTest.

ActionDispatch::IntegrationTest - это класс Rails.Вы смотрите документы для класса Net::HTTP, который является классом Ruby.

Вот документы API для методов ActionDispatch::IntegrationTest.

Получениесмешивание между Ruby и Rails очень распространено в начале.Rails - это фреймворк, Ruby - это язык.

0 голосов
/ 15 декабря 2018

Я думаю, что вы смотрите не в том месте, ссылка показывает http.post.Вы хотите IntegrationTest post.

От: https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/testing/integration.rb

def post(path, **args)
  process(:post, path, **args)
end

И:

def process(method, path, params: nil, headers: nil, env: nil, xhr: false, as: nil)
  request_encoder = RequestEncoder.encoder(as)
  headers ||= {}

  # rest
end

Редактировать: двойной знак

В Ruby 2.0 добавлены ключевые слова аргументы и двойной знак.Одиночный восклицательный знак (*) в основном используется, когда у вас есть неизвестное количество аргументов, и он передается как array.

def with_args(*args)
  p args
end

with_args(1,2,"a")
# [1, 2, "a"]

Двойной восклицательный знак (**) действует как *, но дляАргументы ключевых слов:

def with_args(**args)
  with_keyword(args)
end

def with_keyword(some_key: nil, other_key: nil)
  p "some_key: #{some_key}, other_key: #{other_key}"
end

with_args(some_key: "some_value", other_key: "other_value")
# "some_key: some_value, other_key: other_value"
with_args(some_key: "some_value")
# "some_key: some_value, other_key: "

В ruby ​​вы можете вызывать метод без () и передавать хеш без {}, поэтому

with_args({some_key: "some_value", other_key: "other_value"})

похоже на запись

with_args some_key: "some_value", other_key: "other_value")

См. Этот ответ: Что делает двойной оператор * (сплат) и https://medium.freecodecamp.org/rubys-splat-and-double-splat-operators-ceb753329a78

Итак ...

При записи

post users_path, params: { user: { name:  "",
                                   email: "user@invalid",
                                   password:              "foo",
                                   password_confirmation: "bar" } }

Это вызовы для обработки

process(:post, users_path, params: { user: { name:  "",
                                   email: "user@invalid",
                                   password:              "foo",
                                   password_confirmation: "bar" } }

Значение в process, params - хеш

{ user: { name:  "",
  email: "user@invalid",
  password:              "foo",
  password_confirmation: "bar" } }

Не имеет значения другие аргументы ключевых словпроцесс, хеш - все params, все остальные ключевые слова - ноль

Надеюсь, это имеет смысл ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...