как получить сессионную переменную из params в rails (неопределенный метод '*' для nil-класса - PullRequest
1 голос
/ 25 апреля 2019

В первом контроллере я установил переменные сеанса:

def show
 @item = Item.find(params[:id])
 session[:item_id] = @item.id
 session[:amount] = params[:amount]
end

Мой вид устанавливает сумму с form_tag:

<%= form_tag checkout_transaction_path, method: :get do %>
 <%= label_tag :amount %>
 <%= text_field :amount, placeholder: "Total bid amount", autofocus: true %>

 <%= submit_tag "submit" %>
<% end %>

Параметры, которые отправляются с этой формой, выглядят так:

Parameters: {"utf8"=>"✓", "amount"=>{"{:placeholder=>\"Total bid amount\", :autofocus=>true}"=>"1111"}, "commit"=>"Confirm offer", "id"=>"1"}

Второй контроллер пытается присвоить переменную сеанса переменной экземпляра.

def checkout
 @item = session[:item]
 @amount = session[:amount]
end

Однако работает только @item. Я пытаюсь умножить @amount * 0.10, но получаю эту ошибку: undefined method '*' for nil:NilClass

Что вызывает эту ошибку? В параметрах отправки указано, что отправляется, но, может быть, что-то не так с тем, как я пытаюсь получить его? session[:item_id] отлично проходит.

1 Ответ

1 голос
/ 25 апреля 2019

У вас есть проблема здесь:

Parameters: {"utf8"=>"✓", "amount"=>{"{:placeholder=>\"Total bid amount\", :autofocus=>true}"=>"1111"}, "commit"=>"Confirm offer", "id"=>"sam-lipp-abandonment"}

В ваших параметрах вы отправляете параметры суммы, но в сумме вы отправляете HTML-форму "amount"=>{"{:placeholder=>\"Total bid amount\", :autofocus=>true}"=>"1111"}, но должны отправлять только значение, заданное вами в форме суммы, и ваши параметры суммы должны выглядеть следующим образом! "amount"=>"1"

Так что это означает, что ваша форма не работает правильно! Попробуйте заменить свою форму на этот, и в контроллере вы получите сумму!

<%= form_for @new_item, url: checkout_transaction_path do |f| %>
 <%= f.label :amount %>
 <%= f.text_field :amount, placeholder: "Total bid amount", autofocus: true %>

 <%= submit_tag "submit" %>
<% end %>

ИЛИ тот же код для form_tag

<%= form_tag checkout_transaction_path do %>
  <%= label_tag :amount %>
  <%= text_field_tag :amount, placeholder: "Total bid amount", autofocus: true %>

  <%= submit_tag "Submit Post" %>
<% end %>

Проблема в вашей форме может быть здесь: Вы написали text_field вместо text_field_tag

Также для формы form_for вам нужно добавить в контроллер метод с переменной, который вы будете использовать в своей форме, например, я использую переменную @new_item, откуда вы вызываете эту форму, что-то вроде это

def new
  @new_item = Item.new
end
...