【问题标题】:Rails: Same "Create" action conditional between two modelsRails:两个模型之间的相同“创建”操作条件
【发布时间】:2016-12-08 00:40:20
【问题描述】:

使用三种主要模型制作网站:用户、帖子和健身房。用户应该能够从他们自己的模型 (User.post) 发帖,或者,如果他们是健身房的管理员,则可以从健身房的模型 (Gym.post) 发帖。

我正在使用相同的帖子控制器和帖子表单向健身房或用户发布帖子,但控制器“创建”操作无法区分两者。

class PostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user,  only: :destroy

  def create
    if (gym.gym_admin == current_user.id)
      @post = gym.posts.build(post_params)
       if @post.save
        flash[:success] = "Post!"
        redirect_to "/gyms/#{gym.id}"
       else
        @feed_items = []
        render 'static_pages/home'
       end
     else  
      @post = current_user.posts.build(post_params)
      if @post.save
        flash[:success] = "Post!"
        redirect_to root_url
      else
        @feed_items = []
        render 'static_pages/home'
      end
    end
  end

  def destroy
    @post.destroy
    flash[:notice] = "Post deleted"
    redirect_to request.referrer || root_url
  end

   private

   def post_params
     params.require(:post).permit(:post_type, :title, :content, :picture,     :body_parts,
                              :duration, :equipment, :calories, :protein,
                              :fat, :carbs, :ingredients, :tag_list,
                              :postable_id, :postable_type)
   end

   def correct_user
     @post = current_user.posts.find_by(id: params[:postable_id])
     redirect_to root_url if @post.nil?
   end

   def gym
     @gym = Gym.find_by(params[:id])
   end

end

还有模特:

class Post < ApplicationRecord

  belongs_to :user
  belongs_to :gym 
  belongs_to :postable, polymorphic: true

class User < ApplicationRecord

    has_many :posts, as: :postable, dependent: :destroy
    has_many :gyms

class Gym < ApplicationRecord

has_many :posts, as: :postable, dependent: :destroy
belongs_to :user

现在,这个创建动作只会从健身房的模型中创建帖子;如果我删除条件的前半部分,它只会从 User 模型中发布。

非常感谢您的帮助,谢谢

【问题讨论】:

  • 它可能看起来更重复,但如果您使用两个不同的控制器,它可能会更简单。

标签: ruby-on-rails ruby activerecord model controller


【解决方案1】:

我会很好奇gym.gym_admin(以及“def create”下面的整行)的评估结果是什么,因为我在其他任何地方都没有看到引用。

我怀疑你会想要改变

if (gym.gym_admin == current_user.id)

if (gym.gym_admin.id == current_user.id)

if (gym.gym_admin == current_user)

一旦这种关系正常工作。

此外,可以独立于用户是否是健身房管理员来构建帖子,并在适用的情况下向帖子参数发送gym_id。然后通过以下任一方式访问:

/gym/:id
@posts = Post.where('gym_id = ?', params[:id])

/user/:id
@posts = Post.where('user_id = ?', params[:id])

【讨论】:

  • gym.gym_admin 值是 gym#new 表单中的 hidden_​​tag,它从 current_user.id 生成整数。 &lt;%= f.hidden_field :gym_admin, :value =&gt; current_user.id %&gt;我现在已经将“创建”操作分为 PostsController 中的操作:def create_gym_postdef create_user_post,现在我认为我应该能够找到一种方法来通过一个或另一个路由帖子参数其中 >post 'posts', to: 'posts#create_gym_post' >post 'posts', to: 'posts#create_user_post' 但我似乎不知道该怎么做...
  • 在这种情况下,您是否可以根据此人是否为管理员有条件地更改方法/显示不同的表单?
【解决方案2】:

我修复了它,我完全删除了条件逻辑;我只是在控制器中做了两个单独的自定义操作,并从不同的链接调用它们。 IE。 :actions => create_gym / create_user

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多