Я столкнулся с проблемой, которую я могу решить только частично, и, надеюсь, кто-то более опытный может сказать мне, могу ли я достичь того, чего хочу, или если Я лаяю неправильное дерево.Rails: как читать значение выбора без формы
У меня есть приложение Rails 4, которое использует Devise и CanCan. Я хотел бы сделать небольшой набор функций приложения доступным для гостевых пользователей (не вошел в систему). Я могу добиться этого, указав маршрут маршрута к методу контроллера и используя link_to
, чтобы достичь этого метода. Однако я не могу понять, как получить значение поля выбора для передачи в качестве параметров на этой странице, не делая этого вида формы с помощью form_tag
(нет модели, связанной с этим представлением).
я могу передать жёстко прописанный Params вдоль так:
<%= link_to "Month", activities_search_month_path(:resource_id => 4) %>
, но я предпочел бы иметь что-то вроде:
<%= link_to "Month", activities_search_month_path(:foo => :resource_id) %>
где второй символ относится к значению select_tag
. Этот второй пример доставляет буквальное значение «resource_id», когда я выгружаю ключ :foo
, если я не конвертирую свое представление в форму.
Если я перевернул представление в форму, включив все erb
в form_tag, я получаю сообщение об ошибке 401 Forbidden
, после чего отображается форма входа Devise. Я предполагаю, что в любое время, когда вы хотите обработать форму, Rails (или Devise) требует аутентификации на определенном уровне. Поведение такое же, когда я использую button_to
, а не link_to
, так как button_to
обертывается в виде под обложками.
Как я могу установить этот аргумент resource_id в моем link_to
, или я буду вынужден создать гостевой уровень доступа пользователей и тихо войти в гостевые пользователи? Для UX важно, чтобы пользователи могли получить доступ к этой функции с минимальными затратами усилий.
Заранее спасибо.
Добавление: quick_search метод от контроллера
def quick_search
puts "quick search 0"
if(params[:time_period] == 'today')
@resource = Resource.find(params[:resource_id])
@site = Site.find(params[:site_id])
@time_period_string = "Activities for #{localize_date(Date.today)} at #{@resource.name}, #{@site.name}"
puts "quick search 1"
if user_signed_in?
puts "quick search 2a"
@activities = Activity.where("system_id = ? and start_date = ? and activity_status_id = ? and resource_id = ?", current_system_id, @today, 2, params[:resource_id])
else
puts "quick search 2b"
if(Setting["#{current_subdomain_not_signed_in}.quick_search_guest_access"] == 'true')
puts "quick search 3a"
current_system_id = current_system_id_not_signed_in
@activities = Activity.where("system_id = ? and start_date = ? and activity_status_id = ? and resource_id = ?", current_system_id, @today, 2, params[:resource_id])
else
puts "quick search 3b"
redirect_to '/users/sign_in'
end
end
end
Примечание: метод quick_search никогда не вводится. CanCan (или, возможно, Разрабатывают) шаги немедленно и перенаправляет войти в систему:
Консоль вывода:
Started GET "/activities/quick_search" for 127.0.0.1 at 2015-04-12 18:01:58 -0700
Processing by ActivitiesController#quick_search as HTML
(0.2ms) SELECT DISTINCT "systems"."subdomain" FROM "systems"
Completed 401 Unauthorized in 1ms
Started GET "https://stackoverflow.com/users/sign_in" for 127.0.0.1 at 2015-04-12 18:01:58 -0700
Processing by Devise::SessionsController#new as HTML
(0.2ms) SELECT DISTINCT "systems"."subdomain" FROM "systems"
Rendered layouts/_header.html.erb (0.8ms)
Rendered devise/shared/_links.html.erb (4.1ms)
Rendered devise/sessions/new.html.erb within layouts/application (14.7ms)
Rendered layouts/_footer.html.erb (0.0ms)
Completed 200 OK in 285ms (Views: 282.3ms | ActiveRecord: 0.2ms)
Ability.rb
can :quick_search, Activity
can :search_day, Activity
can :search_week, Activity
can :search_month, Activity
Странно то, что link_to
quick_search терпит неудачу с 401 , но link_to
другие три метода отлично работают - я просто не могу получить параметры для них динамически.
Я использую продолжение CanCan, так что да, CanCanCan, и есть возможность: quick_search, строка активности для пользователей без роли (в блоке else, где я разветвляюсь по ролям). Я * считаю, что CanCan настроен правильно, но Ajax - интересная альтернатива. Однако я не буду следить за вашими мыслями о переадресации. Разве я не просто столкнулся бы с тем же 401 из-за того, что я отправляю параметры из формы? – MarsAtomic
Я думаю, что мне нужно увидеть ваш контроллер, с которым вы справляетесь. Если вы только получаете ошибку при добавлении формы, я думаю, вам нужно другое разрешение для текущего действия. Можете ли вы добавить рассматриваемый контроллер и вашу модель способности? – davidwessman
Обновлено. Все упомянутые выше методы контроллера настроены одинаково, одинаковое разветвление, за исключением всех операторов puts. – MarsAtomic