2013-06-04 5 views
0

Мне нужно передать параметры из формы со значениями, не содержащимися в базе данных (так что форма будет иметь параметры, которые будут использоваться только этой страницей и больше никогда). При отправке формы я хочу передать эти параметры скрипту ruby, который был адаптирован на страницу html.erb.Передача настраиваемого параметра текстового поля _form на вторую страницу Rails

До сих пор все, что мне удалось сделать, это передать один параметр (полученный с более ранней страницы объекта, который имел как модель, так и контроллер), но я не могу передать форму моим текущим параметрам формы. Форма ниже будет отображаться ISBN, полученный из предыдущего link_to правильно

Это в настоящее время моя форма:

<%= form_tag(:controller => "pages", :action => "post_form", :condition =>  params[:condition], :isbn => params[:isbn], :price => params[:price], :description => params[:description], :comment => params[:comment]) do %> 
    <div class="field"> 
    <%= label_tag "Book ISBN" %><br /> 
    <%= params[:isbn] %> 
    </div> 

    <div class = "field"> 
    <%= label_tag "Condition" %> 
    <%= select_tag :condition, raw("<option>Brand New'</option><option>Like New</option><option>Very Good</option><option>Good</option><option>Acceptable</option>")%> 
    </div> 

    <div class = "field"> 
    <%= label_tag "Price" %> 
    <%= text_field_tag :price %> 
    </div> 

    <div class = "field"> 
    <%= label_tag "Description" %> 
    <%= text_field_tag :description %> 
    </div> 

    <div class = "field"> 
    <%= label_tag :comment %> 
    <%= text_field_tag :comment %> 
    </div> 

    <div class = "actions"> 
    <%= submit_tag "Submit"%> 
    </div> 
<% end %> 

Я проверил мой хвост -f войти/production.log и это, как я знаю, что ISBN правильно передается на следующую страницу после отправки. Может ли кто-нибудь помочь мне разобраться, как передать другие параметры, которые должны быть взяты из самой формы?

=========================== EDIT1 ========= ================================= это мой код для post_form. В основном это касается API от Half.com. Мы первоначально испытал это с успехом в качестве рубинового сценария запуска с помощью команды быстрой

<% 
require 'httpclient' 
require 'nokogiri' 
%> 

<% isbn = params[:isbn] %> 
<% condition = params[:condition] %> 
<% price = params[:price] %> 
<% description = params[:description] %> 
<% comment = params[:comment] %> 

<% 
token = 'ourUniqueSellerToken' 

builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') { |xml| 
xml.AddItem('xmlns' => 'default', 'xmlns' => 'urn:ebay:apis:eBLBaseComponents') do 
    xml.RequesterCredentials do 
    xml.eBayAuthToken token 
    end 
    xml.Item do 
    xml.AttributeArray do 
     xml.Attribute('attributeLabel' => 'Condition') do 
     xml.Value do 
      xml.ValueLiteral condition 
     end 
     end 
     xml.Attribute('attributeLabel' => 'Notes') do 
     xml.Value do 
      xml.ValueLiteral comment 
     end 
     end 
    end 
    xml.Country 'US' 
    xml.Currency 'USD' 
    xml.Description description 
    xml.ListingDuration 'GTC' 
    xml.ListingType 'Half' 
    xml.Location 'CO' 
    xml.Quantity '1' 
    xml.StartPrice price 
    xml.ExternalProductID do 
     xml.Value isbn 
     xml.type 'ISBN' 
    end 
    end 
end 
} 

client = HTTPClient.new 
uri = 'https://api.ebay.com/ws/api.dll' 

headers = { 
     'X-EBAY-API-COMPATIBILITY-LEVEL' => '823', 
     'X-EBAY-API-DEV-NAME' => 'ourDevName', 
     'X-EBAY-API-APP-NAME' => 'ourAppName', 
     'X-EBAY-API-CERT-NAME' => 'ourCertName', 
     'X-EBAY-API-SITEID' => '0', 
     'X-EBAY-API-CALL-NAME' => 'AddItem' 
} 

results = client.post_content(uri, builder.to_xml, headers) 

doc = Nokogiri::XML.parse(results) 
%> 

<b><%= "Returned: "+doc.css("Ack").text %> </b> 
<b><%= "Listing ID: "+doc.css("ItemID").text %></b> 

Контроллер для формы это просто пустая функция:

class PagesController < ApplicationController 

    def search 
    end 

    def listing 
    end 

    def post_form 
    end 

end 

========= === Ниже из моего журнала развития (открытие страницы формы) ==============

Started GET "/pages/listing?class=btn+btn-mini&isbn=9780307588364" for 138.67.201.236 at 2013-06-04 20:33:01 +0000 
Processing by PagesController#listing as HTML 
    Parameters: {"class"=>"btn btn-mini", "isbn"=>"9780307588364"} 
    Rendered pages/_form.html.erb (1.4ms) 
    Rendered pages/listing.html.erb within layouts/application (1.9ms) 
Completed 200 OK in 3ms (Views: 3.2ms | ActiveRecord: 0.0ms) 
Started POST "/pages/post_form" for 138.67.201.236 at 2013-06-04 20:33:09 +0000 

(на представленню)

ActionController::RoutingError (No route matches [POST] "/pages/post_form"): 
    actionpack (3.2.13) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' 
    actionpack (3.2.13) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' 
    railties (3.2.13) lib/rails/rack/logger.rb:32:in `call_app' 
    railties (3.2.13) lib/rails/rack/logger.rb:16:in `block in call' 
    activesupport (3.2.13) lib/active_support/tagged_logging.rb:22:in `tagged' 
    railties (3.2.13) lib/rails/rack/logger.rb:16:in `call' 
    actionpack (3.2.13) lib/action_dispatch/middleware/request_id.rb:22:in `call' 
    rack (1.4.5) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.4.5) lib/rack/runtime.rb:17:in `call' 
    activesupport (3.2.13) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
    rack (1.4.5) lib/rack/lock.rb:15:in `call' 
    rack-cache (1.2) lib/rack/cache/context.rb:136:in `forward' 
    rack-cache (1.2) lib/rack/cache/context.rb:143:in `pass' 
    rack-cache (1.2) lib/rack/cache/context.rb:155:in `invalidate' 
    rack-cache (1.2) lib/rack/cache/context.rb:71:in `call!' 
    rack-cache (1.2) lib/rack/cache/context.rb:51:in `call' 
    railties (3.2.13) lib/rails/engine.rb:479:in `call' 
    railties (3.2.13) lib/rails/application.rb:223:in `call' 
    railties (3.2.13) lib/rails/railtie/configurable.rb:30:in `method_missing' 
    passenger (4.0.2) lib/phusion_passenger/rack/thread_handler_extension.rb:77:in  `process_request' 
    passenger (4.0.2) lib/phusion_passenger/request_handler/thread_handler.rb:135:in  `accept_and_process_next_request' 
    passenger (4.0.2) lib/phusion_passenger/request_handler/thread_handler.rb:106:in  `main_loop' 
    passenger (4.0.2) lib/phusion_passenger/request_handler.rb:449:in `block (4 levels) in start_threads' 
    passenger (4.0.2) lib/phusion_passenger/utils/robust_interruption.rb:108:in `disable_interruptions' 
    passenger (4.0.2) lib/phusion_passenger/request_handler.rb:444:in `block (3 levels) in start_threads' 

(При обновлении)

Started GET "/pages/post_form" for 138.67.201.236 at 2013-06-04 20:33:14 +0000 
Processing by PagesController#post_form as HTML 
    Rendered pages/post_form.html.erb within layouts/application (252.9ms) 
Completed 200 OK in 257ms (Views: 256.6ms | ActiveRecord: 0.0ms) 
+0

Какое действие «post_form» в вашем контроллере страниц выглядит в вашем коде? – ply

+0

отредактировал мой вопрос с помощью диспетчера страниц и post_form, если вам это нужно – CimmerianMuse

ответ

0

Вы передаете параметры дважды: один раз по параметрам URL-адрес в действии формы, а что оказывается чем-то вроде

<form accept-charset="UTF-8" action="/pages?comment=params%5B%3Acomment%5D&amp;condition=cond&amp;description=params%5B%3Adescription%5D&amp;isbn=isbn&amp;price=params%5B%3Aprice%5D" method="post"> 

и во второй раз, как POST в форме (кроме ISBN).

Отбросьте параметры в форме и установить их в качестве значения по умолчанию в текстовых полях:

<%= form_tag(:controller => "pages", :action => "post_form" %> 
<%= hidden_field_tag :isbn, params[:isbn] %> 
<%= hidden_field_tag :condition, params[:condition] %> 

... 

<div class = "field"> 
    <%= label_tag "Description" %> 
    <%= text_field_tag :description, param[:description] %> 
</div> 

И это хорошая практика, чтобы иметь тяжелую работу моделью. Вы можете использовать ActiveModel, если это не связано с БД.
Затем вы также можете использовать эту модель для формы и использовать обычные помощники формы.

Добавление

Ваши журналы показывают, что вам не хватает маршрут для POST в pages#post_form.
Добавить в вашем routes.rb

post 'pages/post_form' 

Отправка формы осуществляется с помощью POST запроса, который терпит неудачу.
«Обновить» выполняется по запросу GET.

В Rails у вас должны быть разные действия для GET и POST. Они действительно делают что-то совершенно другое.

+0

Спасибо, что ответ, но у меня все еще есть проблемы. Я сделал то, что вы предлагали, только передавая параметры один раз, но я не думаю, что они действительно отправляются на следующую страницу. Как я могу это проверить? Я ищу в журнале некоторый индикатор переданного параметра и не нахожу ничего. Спасибо за вашу помощь. – CimmerianMuse

+0

Сначала посмотрите на последнюю HTML-страницу, чтобы ее было чистой. Затем вы можете использовать вкладку «firebug», чтобы увидеть, что действительно отправлено браузером. Это должно закончиться хэшем params, который записывается в 'development.log'. Используйте среду разработки для разработки. Это гораздо более многословно. –

+0

На самом деле мне было любопытно. Посмотрите, когда я впервые отправлю форму, на следующей странице изначально будет сказано, что страница не может быть найдена, но если вы обновите страницу, post_form будет виден, но в списке указано, что она не удалась. Может ли требование перезагрузки быть причиной моей проблемы? – CimmerianMuse

Смежные вопросы