1

我想向未登录的用户显示一个“添加到收藏夹”按钮,以便他们可以看到登录的用户可以将帖子(在这种情况下)添加到他们的收藏夹中。

这是当前代码:

路线.rb

resources :users do
  resources :favourites
end
resources :favourites, only: [:create, :destroy]

posts_helper.rb (一旦我开始工作,我会移动这个 application_helper)

PostsHelper
  def new_favourite
    if signed_in?
      return current_user.favourites.build
    else
      return Favourite.new
    end
  end
end

显示.html.erb

<%= render :partial => 'shared/favourites/favourite_form', :locals => { :object => @post } %>

_favourite_form.html.erb

<% if signed_in? && current_user.favourited?(object) %>
  <%= render partial: 'shared/favourites/unfavourite', locals: { object: object } %>
<% else %>
  <%= render partial: 'shared/favourites/favourite', locals: { object: object } %>
<% end %>

_favourite.html.erb

<%= form_for(new_favourite, remote: signed_in?) do |f| %>
    <div>
        <%= f.hidden_field :object_id, :value => object.id %>
        <%= f.hidden_field :object_type, :value => object.class.name.demodulize %>
    </div>
    <%= button_tag(:type => 'submit', :id => 'add_favourite') do %>
       Add to Favourites
    <% end %>
<% end %>

如果用户未登录,我希望它不执行 ajax 调用(即使用页面重新加载提交添加收藏的表单),以便它会看到用户正在尝试访问受保护的页面,将他们重定向到登录并在成功[当它将他们重定向回他们最初尝试去的地方时]它将添加最喜欢的。

有人可以建议我需要改变什么才能做到这一点。


编辑:

更新代码以反映当前状态。

登录后,它会重定向回,No route matches [GET] "/favourites"因为它favourites是 . 下的嵌套资源users


编辑2:

重定向的工作方式与 Rails 教程中的几乎相同:

将用户重定向到登录页面 (signed_in_user): http ://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-correct_user_before_filter

将用户重定向回的存储位置: http ://ruby.railstutorial.org/book/ruby-on-rails-tutorial#code-friendly_forwarding_code http://ruby.railstutorial.org/book/ruby-on-rails-tutorial #code-friendly_session_create

唯一的区别是,在我的登录页面上,我使用 facebook omniauth 链接让用户登录,但登录后的重定向仍然按预期工作。

4

1 回答 1

0

使用辅助方法而不是current_user.favourites.build?

<%= form_for(new_favourite, remote: true) do |f| %>

帮手:

PostsHelper
  def new_favourite
    if signed_in?
      return current_user.favourites.build
    else
      return Favourite.new
    end
  end
end
于 2013-05-01T02:16:53.680 回答