2015-04-12 7 views
1

Я столкнулся с проблемой, которую я могу решить только частично, и, надеюсь, кто-то более опытный может сказать мне, могу ли я достичь того, чего хочу, или если Я лаяю неправильное дерево.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 другие три метода отлично работают - я просто не могу получить параметры для них динамически.

ответ

0

Если вы используете CanCan (Can?), Вы можете определить специальную возможность для гостей.

Как выглядит ваш Ability -модель? Какой контроллер обрабатывает действие, которое вы хотите просмотреть? Как вы выполняете аутентификацию с помощью CanCan в этом контроллере? https://github.com/CanCanCommunity/cancancan/wiki/CanCan-2.0 В разделе «Определяющие способности» вы можете увидеть пример без пользователя.

Фиксация CanCan - это, пожалуй, лучший вариант, если вы не хотите: Для части со ссылкой и полем выбора было бы проще всего обрабатывать форму, а затем обрабатывать перенаправление в контроллере, выполняться с помощью удаленной формы ajax. http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html

Это должно работать:

<% form_tag Activity, activity_quick_search_path, remote: true do %> 
    <%= select_tag :resource_id...%> 
    <%= submit_tag %> 
<%end%> 

Edit после комментариев:

Виновником здесь (был):

before_action :authenticate_user! 

Причинение Завещание перенаправлять войти в страницу.

Однако, если у вас есть CanCan, вам не нужен authenticate_user.

Короткий пример: С только Придумайте я хотел бы сделать:

class NewsController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_news, except: [ :index, :new ] 

    def index 
    @news = News.all 
    end 

    def show  
    end 

    def new 
    @news = News.new 
    end 

    def edit 
    end 

    def create 
    @news = News.new(news_params) 
    flash[:notice] = 'News created' if @news.save! 
    redirect_to @news 
    end 

    def update 
    @news.update! news_params 
    redirect_to @news 
    end 

    def destroy 
    @news.destroy! 
    redirect_to News 
    end 

    private 

    def news_params 
    params.require(:news).permit(some_attributes) 
    end 

    def set_news 
    @news = News.find(params[:id]) 
    end 
end 

Как это выглядит с CanCanCan:

class NewsController < ApplicationController 
    load_and_authorize_resource 

    def index 
    end 

    def show  
    end 

    def new 
    end 

    def edit 
    end 

    def create 
    flash[:notice] = 'News created' if @news.save! 
    redirect_to @news 
    end 

    def update 
    @news.update! news_params 
    redirect_to @news 
    end 

    def destroy 
    @news.destroy! 
    redirect_to News 
    end 

    private 
    def news_params 
    params.require(:news).permit(some_attributes) 
    end 
end 

Что я нахожу супер аккуратный Надеюсь, что это может помочь, а также.

+0

Я использую продолжение CanCan, так что да, CanCanCan, и есть возможность: quick_search, строка активности для пользователей без роли (в блоке else, где я разветвляюсь по ролям). Я * считаю, что CanCan настроен правильно, но Ajax - интересная альтернатива. Однако я не буду следить за вашими мыслями о переадресации. Разве я не просто столкнулся бы с тем же 401 из-за того, что я отправляю параметры из формы? – MarsAtomic

+0

Я думаю, что мне нужно увидеть ваш контроллер, с которым вы справляетесь. Если вы только получаете ошибку при добавлении формы, я думаю, вам нужно другое разрешение для текущего действия. Можете ли вы добавить рассматриваемый контроллер и вашу модель способности? – davidwessman

+0

Обновлено. Все упомянутые выше методы контроллера настроены одинаково, одинаковое разветвление, за исключением всех операторов puts. – MarsAtomic

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