Почему я могу поставить params [: from] в параметре метода? - PullRequest
1 голос
/ 03 марта 2011

Эй, ребята, Я новичок в Ruby и Rails, я сделал небольшой тестовый пример:

/ приложения / хелперы /

module HomeHelper
  def makeach(from, to, by)
    x = from
    while x <= to
      yield x
      x = x + by
    end
  end
end

/ приложения / вид / дом / new.erb

<form action="create" method="post">
  <input type="text" name="from" />
  <input type="text" name="to" />
  <input type="text" name="by" />
  <input type="submit" name="commit" value="Click it" />
</form>

/ приложения / просмотров / Главная / create.erb

модуль HomeHelper

<% makeach(params[:from], params[:to], params[:by]) do |x| %>
<%= x %>
<% end %>

/ приложение / контроллеры / home_controller.rb

class HomeController < ApplicationController
    def index
    end
    def create
    end
    def new
    end
end

После публикации формы в action new, create view ничего не выводит в браузере PS: я знаю, что есть много способов улучшить мой код, но здесь я просто хочу знать, почему я ничего не получил.

1 Ответ

3 голосов
/ 05 марта 2011

Итак, одна вещь, которую вы упускаете, это основная идея REST.Чтобы получить четкое объяснение того, как Rails обрабатывает поток управления, попробуйте этот ответ .

Но, в принципе, когда вы устанавливаете resources :home в своих маршрутах, он определяет семь маршрутов для ваших семи стандартных действий контроллера (SHOW, INDEX, NEW / CREATE, EDIT / UPDATE, DESTROY).

Когда вы пытаетесь загрузить страницу в браузере, вы отправляете запрос GET.Действие NEW принимает запросы GET.Действие CREATE принимает только запросы POST (например, отправка формы).Итак, после того, как вы отправили свою форму в действие CREATE, вам нужно перенаправить на страницу, которая принимает запросы GET, если вы хотите что-то показать посетителю.

В качестве альтернативы может оказаться возможным переопределить Rails по умолчанию, чтобы разрешить CREATEпринимать запросы GET, но я бы посчитал это плохой идеей.

Вероятно, самое простое, что вам нужно сделать, это убедиться, что ваше действие CREATE в вашем контроллере выглядит следующим образом:

def create
  (... do whatever processing of the params you want to do here ...)
  redirect_to home_path # OR whatever other path you want.
end

В конце действия контроллера вы можете выполнить рендеринг (по умолчанию) или перенаправление.Redirect просто переходит к другому действию контроллера и выполняет все, что находится в этом действии.Рендеринг обычно отображает представление с тем же именем, что и действие контроллера, но рендер имеет множество опций, см. Здесь .

Для доступа к параметрам в представлении лучше всего назначитьих в переменную экземпляра.IE:

def ... # any action that accepts GET requests
  @value = params[:value]
end

Однако параметры не будут сохраняться после перенаправления.Поэтому, если вы выполняете POST для одного действия и перенаправляете в другое (обычное соглашение), вам нужно либо сохранить параметры в БД, либо сохранить их в сеанс .

В вашемна тот случай, если вам кажется, что вы должны хранить их в сеансе, поскольку они, кажется, не привязаны к модели.

Затем в следующем действии контроллера вы проверите, есть ли определенные переменные в сеансе, и поместите их в экземпляр.переменные для использования в вашем представлении.

IE:

@value = session[:value] if session[:value]

Я знаю, что это много для усвоения, но я надеюсь, что это поможет вам сосредоточиться на том, что происходит.Последнее предложение, купите и прочитайте Beginning Rails 3 .Это коротко, мило, суть в том, что на прохождение уходит всего выходные, и к концу вы действительно поймете общую картину того, как работают рельсы, и ваша производительность и будущее обучение будут увеличены в четыре раза.

Хорошоудачи!

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