#ruby-on-rails #ruby #string #cookies
#ruby-on-rails #ruby #строка #файлы cookie
Вопрос:
Я пытаюсь установить файлы cookie для пользователей, которые не вошли в систему при создании действия формы. Как только пользователь, не вошедший в систему, нажимает submit, он перенаправляется на действие входа / регистрации, где затем он возвращается на страницу, на которой он был ранее, и форма автоматически заполняется их ранее введенной информацией.
Я успешно добавил файлы cookie, и они сохраняются, но они возвращают странный строковый объект.
"{"1"=>"This is a test answer"}" # 1 is the question_id and 'This is a test answer' is the answer_text
Вот действие создания, в котором я устанавливаю файлы cookie:
def create
store_location
if current_user.nil?
cookies[:answer_entry] = { :value => params[:answers] }
# raise p cookies[:answer_entry].inspect
deny_access
else
params[:answers].each do |question_id, answer_text|
next if answer_text.blank?
question = Question.find(question_id)
question.answers.create!(:answer => answer_text, :user_id => current_user )
raise p question.answer
redirect_to book_questions_path(@book), :notice => "You have successfully submitted your Answer, please answer more!"
end
end
end
Затем я сохраняю файлы cookie в переменной экземпляра в действии show (где появляется форма), а затем передаю переменную в качестве значения в форме:
def show
@book = Book.find(params[:book_id])
@question = @book.questions.find(params[:id])
if user_signed_in?
@answer = cookies[:answer_entry]
else
cookies[:answer_entry] = nil
end
end
И
<%= form_for(:answer, :url => book_question_answers_path(@book, @question)) do |f| %>
<%= text_area_tag "answers[#{@question.id}]", @answer%>
<%= f.hidden_field :user_id, :value => @current_user %>
<%= submit_tag("Submit") %>
<% end %>
И из этого я получаю эту странную строку, автоматически заполняющуюся в поле формы.
У меня есть два вопроса:
- Я понимаю, что это строка «{«1″=>» Это тестовый ответ «}» Но может ли кто-нибудь объяснить, почему внутри есть хэш и почему двойные кавычки экранируются?
- Я хочу отобразить ТОЛЬКО текст ответа («это тестовый ответ») в поле формы, может кто-нибудь указать мне правильное направление для решения этой проблемы? Должен ли я разделить строку и переназначить ее как хэш, а затем вызвать параметры:answer_text ?
Я ценю любую помощь.
Спасибо!
Ответ №1:
Вы сохраняете хэш в cookies[:answer_entry], поэтому, когда вы извлекаете его и сохраняете в переменной экземпляра @answer, вы получаете обратно хэш, и когда вы используете его в text_area_tag, он отображается в виде строки.
Есть несколько способов решить эту проблему
Способ первый
В действии create присвоите cookies[:answer_entry] следующим образом
cookies[:answer_entry] = params[:answers]
Способ второй
В show action извлеките значение из cookies[:answer_entry] следующим образом
@answer = cookies[:answer_entry][:value]
Комментарии:
1. Спасибо за быстрый ответ, но когда я делаю первый способ, я получаю:
undefined method
symbolize_keys!’ для {«1″=>»asdadad»}:ActiveSupport::HashWithIndifferentAccess` и со вторым способом я получаю:can't convert Symbol into Integer
. Должен ли я что-то изменить в представлении?